2016-11-09 3 views
1
<T extends Number> void m1(List<T> list) { 
    list.add(list.get(0)); 
} 

void m2(List<? extends Number> list) { 
    list.add(list.get(0)); 
} 

上記の2つの方法の違いを理解するのは難しいと感じました。
第一の方法m1()は正常にコンパイルが、方法m2()は、コンパイラエラーを生成します。Javaワイルドカードキャプチャ

The method add(capture#1-of ? extends Number) in the type List<capture#1-of ? extends Number> is not applicable for the arguments (capture#2-of ? extends Number)

+1

TypeErasureを.... –

答えて

2

あなたが上限とタイプのリストにITENを追加カントから!あなたはリストやリストを持つことができます。リストやリストは、変更操作のために他のものに適合しません!

List<? extends Number> list = new ArrayList<Integer>(); 
List<? extends Number> list = new ArrayList<Double>(); 
List<? extends Number> list = new ArrayList<Long>(); 

この場合、変数リストには、Numberを拡張する任意のタイプのインスタンスを含めることができます。たとえば、あなたのメソッドで渡すことができます。しかし、そこには、あなたは今、タイプが可能なのではありません。あなたはArrayListを持っていて、新しいDoubleを追加することができます。コンパイル時には、DoubleはNumberを拡張するので意味がありますが、実行時にはこの型のリストは存在せず、Exceptionをスローすることができます。

上限を使用する場合、<? extends T>cantを修正して、ただそれを読んでください! Oracle tutorialがあります(ワイルドカード章の内容を参照 - アッパー境界ワイルドカード下の境界ワイルドカードなど)

関連する問題