2016-09-27 4 views
0

현재 Java (회전 기반 RPG)로 게임을 제작 중이며 인벤토리 UI에 문제가 있습니다. 아마도 내 문제는 잘 알려져 있거나 간단한 해결책이 있지만 교육을받은 적이없는 나는 여전히 질문을 할 것입니다.제네릭에서 참조 유형을 확인하십시오. java

항목을 선택한 후 인벤토리를 표시하는 동안 해당 항목이 SpecificItemWorker 인터페이스를 구현하는지 확인합니다. 즉, takeAction() 메서드로 전달되어야하는 특정 GameObject에 대해 작동합니다. 전달되어야하는 객체를 선택하는 동안, 사용자가 선택할 수있는 가능한 모든 후보 객체를 표시합니다. 예를 들어 사용자가 Upgradable 인터페이스를 구현하는 모든 객체에 대해 작동하는 UpgradeParchment을 선택한다고 가정합니다. 여기서는 Upgradable을 구현하는 인벤토리의 모든 항목을 표시하는 ItemSelector을 시작합니다. 그러나 다른 클래스를 사용하면 가능한 후보가되기 위해 객체가 구현해야하는 인터페이스가 달라집니다 (일부 객체는 특정 객체보다는 게임 환경에서 작동하지만 여기에서는이 경우를 고려하지 않습니다).). 이제는 switch case 문에서 가능한 인터페이스를 하드 코딩하는 대신 동적으로 사용하고 싶습니다. 제네릭을 사용하려고했지만 객체가 instanceof Type 매개 변수인지 확인하는 것은 허용되지 않습니다. 다음 코드는 컴파일 오류가 있습니다 :

package ui; 

import objects.Collectable; 

public class ItemSelector<T> { 
    public void test(Collectable ob) { 
     if (ob instanceof T) {// compile error 
      // do work 
     } 
    } 
} 

사람이 달성 할 수있는 방법을 알고 있나요 어떤 도움을 주셔서 감사합니다.

빠른 답장을 찾으려면 감사합니다.

편집 :testAction() 방법의 매개 변수 내 인벤토리 클래스로 타입 Collectable이 될 것 , Collectable objects.Similarly의 목록이 있습니다, 내 시험 방법에, 나는 그것을 types.Although를 업데이트 불편을 끼쳐 드려 죄송합니다. Collectable 또한 인터페이스입니다. 일반적으로 클래스는 문자 그대로 전달하여이 생성자에 전달하는 클래스 객체가 필요

public class ItemSelector<T> { 
    private final Class<T> clazz; 
    public ItemSelector(Class<T> clazz) { 
     this.clazz = clazz; 
    } 

    public void test(GameObject ob) { 
     if (clazz.isInstance(ob)) {// use token to check type 
      // do work 
     } 
    } 
} 

: 인해 런타임 타입 삭제에

답변

1

, 당신은 클래스에유형 토큰을 불리는 것을 제공해야 예 : MyClass.class

0

class.getTypeName()을 사용하여 유형을 확인하는 방법이 있습니다.

코드에 표시된대로 SpecificItemWorker가 게임 개체라고 가정합니다.


package stackoverflow.question39718130; 

public class ItemSelector<T> { 

    private T t; 

    public ItemSelector(final T t) { 
     this.t = t; 
    } 

    public T getT() { 
     return t; 
    } 

    public void test(final GameObject ob) { 
     /*if (ob instanceof T) {// compile error 
      // do work 
     }*/ 

     if (t.getClass().getTypeName() == ob.getClass().getTypeName()) { 
      System.out.println("Grab item."); 
     } else { 
      System.err.println("No item found."); 
     } 
    } 
} 

package stackoverflow.question39718130; 

public class SpecificItemWorker extends GameObject { 
} 
GameObject을 통과하는 시험 예있다.

package stackoverflow.question39718130; 

public class GameObjectTest { 

    public static void main(final String[] args) { 
     specificItemWorkerTest(); 
    } 

    public static void specificItemWorkerTest() { 
     final GameObject specificItemWorker = new SpecificItemWorker(); 

     final ItemSelector<GameObject> selector = new ItemSelector<>(specificItemWorker); 
     selector.test(specificItemWorker); 
    } 
} 

나는 SpecificItemWorker으로 바로 당신을 이해하기를 바랍니다. 이것이 귀하의 솔루션에 적합한 지 알려주십시오.

+1

'class.getTypeName()'메소드는 클래스 타입에 대한 정보를 반환합니다.하지만 IS-A 관계 테스트를 통과하는 데는 사용할 수 없습니다. 또한 'SpecificItemWorker'는 인터페이스입니다.이것은 사용자가 사용하기로 선택한 객체가 작업 할 다른'Collectable' 객체를 필요로하는지 결정하는 데 사용됩니다. –

+0

여러 수준에서이 오류가 있지만 특히 문자열을 비교하는 데 '=='을 사용하면 오류가 발생합니다 – Bohemian

관련 문제