12

[OK]をので、私は署名(Class<? extends Throwable>... exceptions)でメソッドを呼び出していると私はmainメソッドにここに警告「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は実際にはRuntimeExceptionExceptionThrowableに拡張されていますか?

この警告を取り除くために私のコードを適切に修正する必要がありますか?

私は本当に.class

を使用することがよりよいようだ...私の例外をインスタンス化するような気がしない(どちらか@SuppressWarningsを使用したくない!)

のjavaに任意のヒント7.感謝を使用しています。

+0

警告は「thenThrow」から来て、「when」ではないと確信していますか? 'mockQuery'はどのように宣言されていますか?それはジェネリッククラスのモックですか? –

+0

私はコードをテスト可能な例に変更しました。 – vikingsteve

答えて

11

varargsは実際には配列であり、generics and arrays don't mix(well)なので、従来のvararg型のメソッドを呼び出すと、Javaは伝統的に警告を出しています。これは、配列が技術的に呼び出し側で作成されているためです。

しかし、それはすぐに可変引数メソッドに渡されるためだけに作成したアレイは、しかし、一般的な配列を受信する方法自体は虐待ができ、呼び出し側の観点から、通常の一般的な配列と同じ危険から受けなかったことが明らかになりましたそれら。だから、Javaの7前方に、警告が(あなたのケースでは、onException)メソッド自体に表示され、法に@SafeVarargsアノテーションを使用することによって抑制することができる:あなたはJavaを使用して実際にいない場合

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

7言語、または(それがライブラリー法だと思われるので)あなたがonExceptionを変更することができない場合、あなたは安全にその警告非表示にする@SuppressWarningsを使用することができます、あなたはしかし、この方法で警告を抑制した場合

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

を隔離するために世話をしますこの独自の方法での1つのステートメントは、あなたが誤って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!私は既にMarkの答えを受け入れましたが、あなたの追加にも感謝します。 – vikingsteve

関連する問題