2012-01-17 13 views
2

次のようなものは、コンパイル時エラーまたは実行時エラーを発生させず、なぜ空白かを描画しています。 cls.addの呼び出しでコンパイルエラーを強制する方法はありますか?メソッドシグネチャ内のパラメータ化されたリスト

クラス定義内のTの定義が、内部のメソッドの呼び出しに持ち越されないのはなぜですか?私はクラスをそのようにインスタンス化しなかったことを理解していますが、クラス状態Tの定義は数値でなければなりません。

public class NewClass<T extends Number> { 

    private List<T> id = new ArrayList<T>(); 

    public void add(List<T> elem) { 
     id.addAll(elem); 
    } 

    public static void main(String[] args) { 
     NewClass cls = new NewClass(); 
     cls.add(new ArrayList<String>()); 
    } 
} 

答えて

2

あなたは生タイプを使用しています。この場合、すべてのタイプ情報は無視され、警告が表示されます。

あなたは型パラメータを提供する場合、それは失敗します。

NewClass<Integer> cls = new NewClass<Integer>(); 
cls.add(new ArrayList<String>()); //error 
+0

私はそれが生の種類の使用に関連していると考えました。 公開 void add(リスト elem) しかし、サイコロを使わずにTの定義を強制する方法があると思いました。助けてくれてありがとう。 – sma

1

あなたはCLSをインスタンス化するときは、例えば、ジェネリック型を提供する必要があります。:

NewClass<Integer> cls = new NewClass<Integer>(); 
+0

いいえ、このチェックはまだジェネリック型が必要な 'cls'にあります。まだ生のタイプを使用しています。 – Thomas

+0

@トーマス良いキャッチ。編集されました。 – GriffeyDog

1

ジェネリック医薬品の使用は(あなたは、生タイプを使用している)、その場合には無効になっているので、これは警告になります。後方互換性の理由からです。コンパイラに警告をエラーとして扱わせるようにすることができます:Javac: Treat warnings as errors

+0

良い点。エラーの設定として警告を扱うことは決して考えなかった。 – sma

関連する問題