12

わかりましたので、シグネチャを使用してメソッドを呼び出すと(Class<? extends Throwable>... exceptions)、メイン メソッドで「File.java uses unchecked or unsafe operations」という警告が表示されます。

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

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

コンパイラは、それが実際に,と をIllegalArgumentException拡張していることを確認できるはずではありませんか?RuntimeExceptionExceptionThrowable

この警告を取り除くためにコードを適切に修正するにはどうすればよいですか?

例外をインスタンス化する気はあまりありません....class

(どちらも使いたく@SuppressWarningsない!)

Java 7を使用しています。ヒントをありがとう。

4

2 に答える 2

13

varargs は実際には単なる配列であり、ジェネリックと配列は (うまく) 混在しないため、Java は伝統的に、ジェネリック vararg 型でメソッドを呼び出すと警告を出しています。これは、配列が呼び出し元で技術的に作成されているためです。

ただし、varargs メソッドに渡すためだけに作成された配列は、呼び出し元の観点からは通常のジェネリック配列と同じ危険にさらされていないことがすぐに明らかになりましたが、ジェネリック配列を受け取ったメソッド自体はそれらを悪用する可能性があります。したがって、Java 7 以降では、警告はメソッド自体 (この場合は ) に表示され、メソッドの注釈をonException使用して抑制することができます。@SafeVarargs

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

実際に Java 7 言語を使用していない場合、または変更できない場合onException(おそらくライブラリ メソッドであるため)、@SuppressWarningsその警告を安全に非表示にするために使用できます。

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

ただし、この方法で警告を抑制する場合は、この 1 つのステートメントを独自のメソッドで分離して、他の将来の警告を誤って抑制しないように注意してください。

個人的には、一般的な vararg 警告を IDE で完全に無効にしています。呼び出し元の観点からは、間違ったコードを示すことはほとんどないからです。

于 2013-02-27T14:46:07.700 に答える
12

そこを意識するとわかりやすい

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

は単なるシンタックスシュガーです

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

つまり、呼び出しサイトは、可変引数の型と等しいコンポーネント型を持つ配列を作成します。

もちろん、new Class<? extends Throwable>[]Java では許可されていません。したがって、コンパイラはnew Class<?>[]代わりに実行し、警告を出します。

于 2013-02-27T19:39:59.370 に答える