2012-09-14 5 views
2

Class<List>, Class<List<?>> 또는 Class<List<Anything>은 실제로는 Class을 참조합니다.매개 변수화 된 인터페이스를 구현하는 클래스를 올바르게로드하는 방법은 무엇입니까?

나는

class MyClass implements List<SomeClass> { 
    // ... 
} 

내가 다음 다음 날

List<SomeClass> myInstance = myClass.newInstance(); 

트릭을 쓸 수 것

Class<? extends List<SomeClass>> myClass = MyClass.class; 

내가이로드하고자하는 것입니다 쓸 수있다 그러나 경우 클래스를 반영하여 ClassLoader.loadClass을 사용하고 같은 유형의 myClass을 선언합니다. 이 작업을 수행하는 가장 적절한 방법은 무엇입니까?

나는 컴파일 경고를 발생시키지 않고 의 더 강력한 버전과 같은 수퍼 유형의 런타임 검사를 의미하는 @SuppressWarnings을 필요로하지 않는 솔루션을 원합니다.

+0

아마도 동일합니다 : http://stackoverflow.com/questions/356583/can-i-reflectively-instantiate-a-generic-type-in-java – zeller

+0

사실 그것은 같은 문제인 것처럼 보입니다. 답변 : ( –

+0

경고를 억제하는 것이 좋지 않거나 방탄 유형 검사가 필요하지 않기 때문에 이런 유형의 요구 사항이 있습니까? –

답변

2
public Class<?> loadClass(String name) throws ClassNotFoundException 

그것은 Class<?> 일반 클래스를 반환으로 your type information is lost here. 따라서 원하는 유형으로 타입 변환해야합니다.

+0

내가 아래에 내 의견을 말했듯이, 형식 정보가 여전히 있습니다. 그것은 런타임에 확인하고 경고를 피하기 위해 어려운 것처럼 보입니다. 일반적으로 수 있습니다. 'Class.asSubclass' (런타임 검사도 수행함)를 사용하여 유형 변환을 피하십시오. 그러나 제네릭에서는 잘 작동하지 않습니다. –

0

일반 서명으로 클래스를 컴파일하면 제네릭에 대한 모든 정보가 손실됩니다. JVM를 들어, 그냥 좋은대로 : 당신이 javap와 클래스를 컴파일하는 경우

class MyClass implements List { 
    // ... 
} 

이를 확인하실 수 있습니다 : 당신이 거기에 더 일반적인 물건을 볼 수 있습니다. Generics는 주로 컴파일 타임 검사에 사용됩니다. 따라서 리플렉션을 사용하여 클래스를로드하면 일반 버전으로 클래스를 캐스팅해야합니다.

+0

T 그의 주장은 틀린 믿음이며, 일반 정보의 일부만 손실되지만 종속 클래스를 컴파일하는 데 필요한 모든 것이 유지됩니다. 'MyClass.class.getGenericInterfaces()'를 사용하면'List '전체를 볼 수 있습니다. –

+0

@DidierL : 오, 죄송합니다. 그 방법에 대해서는 몰랐습니다. –

관련 문제