객체가 제네릭 유형의 인스턴스인지 확인하는 방법이 있습니까?
public <T> test(Object obj) {
if (obj instanceof T) {
...
}
}
그것은 분명히 작동하지 않습니다. 대안이 있습니까? Java 리플렉션을 사용하여 클래스를 인스턴스화 한 다음 generic 형식인지 확인하고 싶습니다 T
.
객체가 제네릭 유형의 인스턴스인지 확인하는 방법이 있습니까?
public <T> test(Object obj) {
if (obj instanceof T) {
...
}
}
그것은 분명히 작동하지 않습니다. 대안이 있습니까? Java 리플렉션을 사용하여 클래스를 인스턴스화 한 다음 generic 형식인지 확인하고 싶습니다 T
.
답변:
이 검사를 수행 할 수있는 유일한 방법 Class
은 유형을 나타내는 객체가있는 경우입니다.
Class<T> type; //maybe passed into the method
if ( type.isInstance(obj) ) {
//...
}
Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Mark Peters가 언급 한대로 클래스 유형을 매개 변수로 전달하지 않으려면 다음 코드를 사용할 수 있습니다. David O'Meara에 대한 명성.
Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
if (type.isInstance(obj)) {
...
}
Type safety: Unchecked cast from Type to Class<T>
이것을 시도해 볼 수 있습니다.
// Cast your object to the generic type.
T data = null;
try {
data = (T) obj;
} catch (ClassCastException cce) {
// Log the error.
}
// Check if the cast completed successfully.
if(data != null) {
// whatever....
}
유형 T
을 매개 변수화하는 데 유형 이 사용되는 위치에 제한을 두는 것이 더 합리적 Class
입니다. 대신 같은 것을 사용하는,의 유형을 통과하면 Class<?>
, 당신은 사용해야합니다 Class<? extends T>
.
이것은 T 유형의 객체가있는 경우에만 (부분적으로) 작동합니다. 그러면 해당 객체의 클래스를 가져 와서 해당 객체 java.lang.Class<T>
와 동일한 지 확인 하고 찾을 수 있습니다.
그러나 이것은 우리가 장르가있는 바로 그 이유와 상반된다는 점에 유의하십시오. 제네릭 유형을 사용하는 것은 그것이 실제로 어떤 유형인지 (지정 될 수있는 상한 및 하한까지) 상관하지 않는다는 것을 말하는 방법입니다.
type
메소드 매개 변수 로 가져 오지 않으려면 초기화 할 수 있습니다.Class type = ((T) new Object()).getClass();