>source

외부 라이브러리에 다른 유형의 예외를 등록하려는 함수를 만들고 있습니다. 그들은 이미 Class를 매개 변수로 받아들이는 메소드를 정의했습니다.

구성에서 다른 예외를 읽고 등록하고 싶지만 typecast 경고가 표시됩니다. 무시/억제 할 수 있지만 억제하지 않을 방법이 있습니까?

정확한 경고는 Type safety: Unchecked cast from Class<capture#2-of ?> to Class<? extends Throwable>

다음은 경고를 발생시키는 샘플 코드입니다.

Class<?> exceptionClass = Class.forName("java.lang.Exception"); //Getting this value from Config. Let us assume that config is good and I get only valid classname which extends Throwable
registerExceptionInExternalLibrary((Class<? extends Throwable>)exceptionClass); // Getting the warning here

오브젝트가 없기 때문에 여기서 캐스팅 할 수 없다고 생각합니다. 하지만 캐스팅을 사용하지 않으면이 경고가 표시됩니다.

The method registerExceptionInExternalLibrary(Class<? extends Throwable>) in the type XXXXX is not applicable for the arguments (Class<capture#2-of ?>)

다음은 해당 코드 샘플입니다.

Class<?> exceptionClass = Class.forName("java.lang.Exception"); //Getting this value from Config. Let us assume that config is good and I get only valid classname which extends Throwable
registerExceptionInExternalLibrary(exceptionClass); // Getting the warning here


  • 답변 # 1

    이를 위해 Class.asSubClass를 사용할 수 있습니다.

    Class<?> exceptionClass = Class.forName("java.lang.Exception");
    registerExceptionInExternalLibrary(exceptionClass.asSubclass(Throwable.class));
    
    

    메서드의 전체 코드는 다음과 같으며 캐스트 (및 경고 억제)를 JDK 메서드로 오프로드하는 것이므로 너무 마법 같은 것은 없습니다. 그러나 그것은 매우 편리합니다 map() 여기서도 잘 작동합니다. 또한 올바른 캐스트를 만들고 있는지 확인합니다. isAssignableFrom , 캐스트를 직접 수행하고 경고를 표시하지 않은 경우 작성하는 것을 잊은 추가 기능입니다.

    @SuppressWarnings("unchecked")
    public <U> Class<? extends U> asSubclass(Class<U> clazz) {
        if (clazz.isAssignableFrom(this))
            return (Class<? extends U>) this;
        else
            throw new ClassCastException(this.toString());
    }
    
    

  • 답변 # 2

    확인되지 않은 캐스트에 대한 비슷한 질문이 있습니다.

    요컨대, 컴파일러는 exceptionClass 유형의 변수입니다. Class<? extends Throwable> , 그래도 경고가 표시됩니다.

    제한된 범위로 @SuppressWarnings 주석을 사용할 수 있습니다.

    @SuppressWarnings("unchecked")
    Class<? extends Throwable> exceptionClass = (Class<? extends Throwable>)Class.forName("java.lang.Exception");
    
    

    여기에있는 주석은 전체 메서드에 영향을주지 않습니다.

  • 이전 python - 최적화 프로그램 식별자를 해석 할 수 없습니다 -
  • 다음 r - 반짝이는 틱과 백틱으로 group_by_ ()를 사용하는 방법>