12

내가 서명 (Class<? extends Throwable>... exceptions)와 메소드를 호출 그리고 난이 주 방법 여기에 경고 "File.java이 선택 취소 또는 안전하지 않은 작업 사용"얻을 수 있도록 확인 :왜 varargs (Class <? extends Throwable> ... t)가 "확인되지 않거나 안전하지 않은"연산입니까?

public class VarargsFun { 
    public void onException(Class<? extends Throwable>... exceptions) { } 

    public static void main(String[] args) { 
     new VarargsFun().onException(IllegalArgumentException.class); 
    } 
} 

컴파일러는 할 수 없어야을 IllegalArgumentException은 실제로 RuntimeException, ExceptionThrowable까지 확장됩니까?

이 경고를 제거하려면 코드를 올바르게 수정해야합니까?

정말 ... 사용하는 더 좋은 것 같습니다 내 예외를 인스턴스화하는 기분하지 않는 .class

(중 @SuppressWarnings를 사용하려면 그나마!)

하는 자바에게 어떤 조언 7. 감사를 사용하고 .

+0

경고가 'thenThrow'에서 온 것이고 언제부터입니까? 'mockQuery'는 어떻게 선언됩니까? 그것은 일반적인 클래스의 모의인가? –

+0

그래 코드를 테스트 가능한 예제로 변경했습니다. – vikingsteve

답변

11

varargs가 실제로는 배열이고 generics and arrays don't mix (잘)이기 때문에 자바는 일반적인 vararg 유형의 메소드를 호출 할 때 전통적으로 경고를주었습니다. 배열이 기술적으로 호출자에서 만들어지기 때문입니다.

그러나, 곧 가변 인자 메서드에 전달 될만을 만들어 배열 그러나 일반 배열을받은 방법 자체가 남용 할 수는 발신자의 관점에서 일반 일반 배열과 같은 위험으로부터 고통을하지 않은 것이 분명했다 그들. 그래서 자바 7 앞으로의 경고는 (귀하의 경우, onException) 방법 자체에 표시 및 방법에 @SafeVarargs 주석을 사용하여 억제 할 수 있습니다 당신은 자바를 사용하여 실제로하지 않은 경우

@SafeVarargs 
public void onException(Class<? extends Throwable>... exceptions) { } 

7 언어 또는 (이 라이브러리 방법입니다 아마도 때문에) 당신이 onException를 변경할 수없는 경우 당신은 안전하게 그 경고 숨길 @SuppressWarnings를 사용할 수 있습니다, 당신은 그러나이 방법으로 경고를 억제하면

@SuppressWarnings("unchecked") 
public static void main(String[] args) { 
    new VarargsFun().onException(IllegalArgumentException.class); 
} 

를 분리하는데주의를 기울여야 우연히 ot를 억제하지 않도록 독자적인 방법으로이 한 문장 그녀의 미래 경고.

개인적으로 나는 IDE에서 호출자의 관점에서 잘못된 코드를 거의 나타내지 않으므로 개인용으로 완전히 가변적 인 경고를 사용하지 않습니다.

+0

마지막 단락을 포함하여 답을 다시 읽으십시오. 감사! – vikingsteve

+0

나는 또한 이것으로부터 소나의 경고를받지 못한다는 것이 이상하다. 어떤 경우이든 메서드에 @SuppressWarnings ("unchecked")'을 추가했습니다. 다시 Thx. – vikingsteve

11

new VarargsFun().onException(IllegalArgumentException.class); 

new VarargsFun().onException(
    new Class<? extends Throwable>[]{ IllegalArgumentException.class }); 

만을위한 문법 설탕 것을 깨닫게 경우 이해하는 가장 쉬운 방법 즉 호출 사이트는 가변 인자의 종류와 동일한 구성 요소 유형을 가진 배열을 만듭니다.

물론 new Class<? extends Throwable>[]은 Java에서 허용되지 않습니다. 그래서 컴파일러는 new Class<?>[] 대신 경고를합니다.

+0

감사합니다 newacct! 나는 이미 마크의 대답을 받아 들였지만 당신의 답변을 추가해 주셔서 감사합니다. – vikingsteve