2

나는 RestHandler 매개 변수화 된 인터페이스가 있습니다.Java 일반 매개 변수화 된 클래스 : 바인딩되지 않은 와일드 카드 대 원시 형식

public interface RestHandler<T> { 
    blah blah blah... 
} 

그리고 Class.forName을 사용하여 config에서 클래스를 만들어야합니다. 이제는 세 가지 버전으로 나뉘어 모든 버전이 성공적으로 컴파일됩니다.

버전 1 :

@SuppressWarnings("unchecked") 
public static <T> RestHandler<T> create(final String handlerImplFqcn) throws ClassNotFoundException, 
                    IllegalAccessException, 
                    InstantiationException { 
    Class<?> handlerClass = Class.forName(handlerImplFqcn); 
    return (RestHandler<T>) handlerClass.newInstance(); 
} 

버전 2 :

public static RestHandler<?> create(final String handlerImplFqcn) throws ClassNotFoundException, 
                    IllegalAccessException, 
                    InstantiationException { 
    @SuppressWarnings("rawtypes") 
    Class handlerClass = Class.forName(handlerImplFqcn); 
    return (RestHandler<?>) handlerClass.newInstance(); 
} 

버전 3 :

public static RestHandler<?> create(final String handlerImplFqcn) throws ClassNotFoundException, 
                    IllegalAccessException, 
                    InstantiationException { 
    Class<?> handlerClass = Class.forName(handlerImplFqcn); 
    return (RestHandler<?>) handlerClass.newInstance(); 
} 

내 질문은, 왜 모든 일 어느 하나가 가장 좋은 방법이 될 것입니다?

+0

내 개인적인 취향은, 첫 번째 예제입니다. 이 모든 예제에서 ClassCastException을 던질 수도 있습니다. – Dave

답변

2

버전 1은 이것에 다시 작성 : 당신은 SuppressWarnings 주석을 필요가 없습니다 불구하고

public static <T extends RestHandler<?>> RestHandler<T> create(final String handlerImplFqcn) throws ClassNotFoundException, IllegalAccessException, InstantiationException, ClassCastException { 
    Class<T> handlerClass = (Class<T>) Class.forName(handlerImplFqcn); 
    return (RestHandler<T>) handlerClass.newInstance(); 
} 
+0

당신이 이 '공용 static RestHander 확장> 뜻 T 생성 (문자열 handlerImplFqcn가) 발생시 IllegalAccessException,있는 InstantiationException, ClassNotFoundException가 { 클래스 handlerClass = (클래스 )가 Class.forName (handlerImplFqcn); return handlerClass.newInstance(); }' –

0

버전 1을 사용하십시오.

버전 2는 원시 유형을 사용합니다. 가능하면이 유형을 사용하지 마십시오.

버전 3은 <?>을 사용합니다.이 패턴은 달성하려는 의미를 거의 달성하지 못하기 때문에 종종 반대 패턴이기도합니다.