2013-04-19 2 views
5

코드를 컴파일하는 동안 Object Casting에 대한 경고 메시지가 나타납니다.일반 오브젝트의 오브젝트 유형을 확인하는 적절한 방법은 무엇입니까?

MyObj obj1 = new MyGenericObj<Integer>(); 
if (obj1 instanceof MyGenericObj) { 
    //I was trying to check if it's instance of MyGenericObj<Integer> 
    //but my IDE saying this is wrong syntax.... 
    MyGenericObj<Integer> obj2 = (MyGenericObj<Integer>) obj1; 
    //This line of code will cause a warning message when compiling 
} 
: 나는 방법의 나는 그것이 MyGenericObj<T>가 아닌 일반 객체 여기 MyObj

에서 확장하는 일반 객체가 있다고 가정 해 봅시다 .... 내 현재의 지식으로 문제를 해결하는 샘플 코드는 아무 생각이 없다

이 작업을 수행하는 적절한 방법이 무엇인지 알려 주시기 바랍니다.

도움을 주시면 감사하겠습니다.

답변

6

type erasure 때문에이 방법을 사용할 수 없습니다. MyGenericObj<Integer>은 형식 매개 변수에 관계없이 실제로는 MyGenericObj<Object>입니다.

class MyGenericObject<T> { 
    private final Class<T> theClass; 
    public Class<T> getTypeArg() { 
     return theClass; 
    } 
    MyGenericObject(Class<T> theClass, ... the rest of constructor parameters) { 
     this.theClass = theClass; 
     ... the rest of the constructor ... 
    } 
} 

지금 당신이 형식 매개 변수의 실제 클래스를 찾을 getTypeArg를 사용 Integer.class과 비교 할 수 있으며,이 주변

한 가지 방법은 다음과 같이 당신의 일반 객체에 Class<T> 속성을 추가 할 것 그 결정을 기반으로 결정하십시오.

+0

먼저 도움을 주셔서 감사합니다. 따라서 'theClass'객체에서 객체 유형을 저장하는 장소가 있다면 'Integer.class'와 비교해보십시오. – user2296188

+0

@ user2296188 기본적으로 예 - 다음과 같이 작성합니다. if (i instanceof MyGenericObject && ((MyGenericObject) i) .getTypeArg() == Integer.class) {...}'. 실례로 ideone ([link] (http://ideone.com/j85Uj9))에서이 데모를보십시오. – dasblinkenlight

+0

나는 그것을 지금 ~~ 고마워! 나는 그것을 밖으로 시도하고 경고 메시지가 지워지는지 확인합니다 ... – user2296188

관련 문제