問題は、タイプの消去のために、実行時にどのタイプの Number がリストに追加されるかをコンパイラが認識できないことです。次の例を検討してください。
public static void main(String[] args) {
List<Integer> intList= new ArrayList<Integer>();
// add some Integers to the list here
countList(intList, 4);
}
public static void countList( List<? extends Number> list, int count ) {
for( double d = 0.0; d < count; d++ ){
list.set((int)d, d-1); // problem at d-1, because at runtime,
// the double result of d-1 will be autoboxed to a Double,
// and now you have added a Double to an Integer List (yikes!);
}
}
このため、構文を使用して一般的に型指定された Collection に追加することはできません。? extends SomeObject
追加する必要がある場合は、メソッド宣言を次のように変更できます。
- メソッド宣言を次のように変更します
public static void countList( List<Number> list, int count )
- メソッドを に変更し
public static void countList( List<? super Integer> list, int count )
ます。
いずれにせよ、リストが宣言されているものと同じ型ではないものをリストに追加することは決してないので安心できるので、コンパイラは不平を言うのをやめます。