2013-02-28 4 views
0

나는 사이트가 비슷한 질문을 가지고 있다는 사실을 알고 있으며, 주어진 질문을 빨리 읽음으로써 떠오르는 첫 번째 대답은 "아니오, 당신은 할 수 없습니다 "그러나 나는 아직도 내가 구하는 것이 어떤 수단으로도 불가능하지 않다는 인상을 받는다.런타임에 제네릭 클래스의 유형을 결정하십시오.

클래스에 제네릭 메서드를 만들었으므로 메서드에 전달 된 Object 형식을 확인하고 싶습니다. 직접적으로 처리 할 수 ​​없다는 것을 알고 있으므로 객체에 Class<T> obj를 전달합니다. 그러나 메서드 본문에서 형식 검사를 제대로 수행하는 방법을 찾을 수 없습니다. ClassA, ClassB 또는 ClassC : T 항상 3 가지 유형이라고 가정

public <T> void readData(T obj1, Class<T> obj2){ 
} 

. if-else-if 블록은 어떻게 보이게해야합니까? obj2가 나타내는 클래스 또는 인터페이스에 obj1 캐스트

+2

orst는 if (obj1 instanceof ClassA) {...} if (obj1 instanceof ClassB) {...} ....' –

+0

언제나 obj1.getClass(). getSimpleName(). equals (same)을 수행 할 수 있습니다. obj2에 대한) 그리고 따라서 그들은 이름에서 동등한 지 알면, 그렇지 않으면 왜 * 두 개의 매개 변수를 보내는 지 알지 못합니다. – Infested

+0

@ LuiggiMendoza가 옳습니다. 이 경우 obj2가 필요하지 않습니다. – Pace

답변

0

사용 obj2.cast(obj1)obj1 유형 T에 할당 할 obj1 경우 (null는 모든 유형에 할당되어 있습니다)를 반환하고, 그렇지 않으면 ClassCastException가 발생합니다. obj1의 정적으로 알려진 형식이 이미 Tobj2.cast(obj1)==obj1 (캐스트가 성공하면) 때문에

우리는 결과 캐스트의에 관심이 없습니다. 그러나 캐스트가 실패하면 초기 예외가 발생합니다.

예 (Class<String>-Class<?>에서 체크 캐스트가 임)

public <T> void readData(T obj1, Class<T> obj2){ 
obj2.cast(obj1); 
//... 
} 

다음 호출 실패 :

readData("Hello",(Class<String>)(Class<?>)Integer.class); 

을 방법 cast가도 체크 캐스트 교체 유용 인스턴스 :

public <T> void readData(Object obj1, Class<T> obj2){ 
T t = (T)obj1;//BAD: unchecked cast 
//... 
} 


public <T> void readData(Object obj1, Class<T> obj2){ 
T t = obj2.cast(obj1());//GOOD: ClassCastException if the cast fails 
//... 
} 
관련 문제