2017-12-26 15 views
1

:今ジェネリック - 生タイプの警告のための正しい治療:一般的なメソッドを実装するとき、私は次のステートメントを使用

@SuppressWarning({"unchecked"}) 
private static <T extends Comparable<T>> T[] merge(T[] arrayA, T[] arrayB) { 
    ... 
    T[] result; 

// This is the line that needs that gives warnings  
    result = (T[]) Array.newInstance(arrayA.getClass().getComponentType(), arrayA.length + arrayB.length); 
    ... 

を、多くのプログラミングのソースは、それがチェックされない生のための@SuppressWarningsを使用しないように良いプログラミングの練習だと述べていますタイプ。しかし、この場合、私はコード内でこの警告に対処する方法を知らない。 Javaでジェネリック型をインスタンス化するベストプラクティスをネットで検索しても、明確なアプローチはありません。実際、私が見つけた解決策の多くは理想的ではありません。

このコードでは、メソッドに@SuppressWarningsを追加しないで、生の型の警告を削除するにはどうすればよいでしょうか?私は最良のアプローチをしましたか?

答えて

1

@SuppressWarningsを回避できない場合もあります。ジェネリック配列を扱うときは、標準のJDKクラスでも@SuppressWarnings("unchecked")を使用します。

例:

Arraysクラス:

private static <T extends Comparable<T>> T[] merge(T[] arrayA, T[] arrayB) { 
    T[] result = Arrays.copyOf (arrayA, arrayA.length+arrayB.length); 
    System.arraycopy (arrayB, 0, result, arrayA.length, arrayB.length); 
    return result; 
} 
+0

恐ろしい:Arrays.copyOf

@SuppressWarnings("unchecked") public static <T> T[] copyOf(T[] original, int newLength) { return (T[]) copyOf(original, newLength, original.getClass()); } 

いえば、あなたの代わりにあなたの現在のロジックのSystem.arraycopyと組み合わせて、そのメソッドを使用することができます。ありがとう! –

関連する問題