리턴 된 클래스가 generic (Bar<T> extends Foo<T>
또는 기타 등등)으로되어 있다면, (삭제로 인해) 유형 시스템이 런타임에 확인할 방법이 없기 때문에 가능하지 않다는 것을 확신합니다. 반환되는 Class.forName(...)
클래스는 Class<Bar<U>>
또는 이와 반대 인 Class<Bar<T>>
입니다. 실제로 Bar<...>
유형을 나타내는 하나의 Class
객체가 있지만 형식 시스템에는 표현이 없으므로 Class<Bar<T>>
과 Class<Bar<U>>
은 완전히 다른 유형의 객체입니다.) 가장 가까운 객체는 무엇인가입니다. 이 같은 : 당신이 Foo<T>
에 대한 충분한 정보를 가지고 있다는 생각으로 컴파일러를 속여 검사되지 않은 캐스트를 사용
<T> Class<? extends Iterable<T>> createClassObject
(final String className, final Class<T> clazz) throws Exception
{ return Class.forName(className).asSubclass(getIterableTClass(clazz)); }
@SuppressWarnings("unchecked")
<T> Class<? extends Iterable<T>> getIterableTClass(final Class<T> clazz)
{ return (Class<? extends Iterable<T>>)(Class<?>)Iterable.class; }
(이 경우 Iterable<T>
에서)를 asSubclass
검사를 할 수 있습니다.
그러나 반환되는 클래스가 이 아니고이 아닌 일반 (Bar extends Foo<String>
또는 그 이상)이라고 가정하면 확실하지 않습니다. 나는 그것들을 다루는 반성의 부분들에 대해서는 다루지 않았지만 그것이 존재한다는 것을 알고있다. 나는 그들이 실제로 당신이 Foo<String>
을 확장하는지 결정하기 위해 Bar
의 상속 계층 구조를 충분히 검사 할 수 있다고 확신하지만, 컴파일러가 당신에게 ' 그렇게 했어.
은''클래스'보다는'T'의 인스턴스 classTypeVariable'하지 않나요? –
Thomas
Btw, 런타임에 클래스를 생성 하시겠습니까? 아니면 그냥 찾으세요? 또는 그 클래스의 인스턴스, 즉 객체를 만들고 싶습니까? – Thomas
@ 토마스, Class > 개체 인 Class.forName()의 반환 결과를 사용합니다. – jilt3d