2014-02-05 4 views
2

개체가 매개 변수화 된 유형의 일반 클래스 (예 : ArrayList<String>)의 인스턴스인지 어떻게 확인할 수 있습니까? 나는 시도했다 :instanceof for java의 템플릿 유형

if(obj instanceof ArrayList<String>) 

그러나 그것은 컴파일러 오류와 함께 실패했다!

답변

3

, 당신이 할 수없는/타입 삭제 때문에이 작업을 수행해서는 안된다. 매개 변수화 된 유형은 컴파일 시점까지만 존재하며 런타임 중에는 존재하지 않습니다. 따라서 런타임시 제네릭 및 매개 변수화 된 유형에 의해 유형 안전성을 보장 할 수 없습니다. 그들은 프로그래밍하는 동안 타입 안전성을 보장하기 위해 존재하지만 타입이 적절히 대체되고 남아있는 것은 매개 변수화되지 않은 일반 클래스이므로 프로그램이 실행되는 시점까지 모든 타입 정보가 없어집니다. 최고의, 당신은 같은 것을 할 수 있습니다

obj instanceof ArrayList 

objArrayList의 인스턴스인지 여부를 확인하기 :

obj.get(0) instanceof String 

ArrayList에 저장된 개체가 String의 인스턴스 여부를 확인 할 수 있습니다. 물론 어떤 요소가 먼저 있는지 확인할 수 있습니다.

또는 반사를 사용할 수 있습니다 (예 : ParametrizedType 인터페이스의 getActualTypeArguments() 참조).

+1

영리한 해결책이 있지만 목록이 비어있을 수도 있습니다. –

+0

이 크기 검사를 먼저 수행해야한다는 말도없이 가야한다. 그러나 나는 그 대답에 덧붙였다. –

+1

물론 당신은 여전히 ​​그것을 반영하여 할 수 있습니다. 참조 http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime/3404169#3404169 및 http://docs.oracle.com/javase/6/docs/api/java /lang/reflect/ParameterizedType.html#getActualTypeArguments%28%29. 그러나이 작업을 수행하는 것이 (매우) 나쁜 설계의 징후 일 수 있음을 명심하십시오. –

1

java에 런타임에 Generics가 없기 때문에. 그래서 컴파일러는이 논리를 허용하지 않을 것입니다. 한마디로