0

countList メソッドでコンパイル時エラーが発生します。

public static void countList( List<? extends Number> list, int count ){
        for( int i = 0; i < count; i++ ){
            list.set(i, i-1);
        }
}

public static void clearList( List<?extends Number> list){
    list.clear();
}

それは言います: メソッド set(int, capture#2-of ? extends Number) リスト型のメソッドは、引数 (int, int) には適用できません

このエラー メッセージはどういう意味ですか? リストに要素を設定できないのはなぜですか? リストをクリアしても問題ないのはなぜですか?

4

2 に答える 2

3

「数を拡張するものだけど、何だかわからない」のリストだからです。そこに整数を入れるだけではいけません。実際に double のリストだったらどうでしょうか?

List<Double> list = new ArrayList<Double>();
list.add(Double.valueOf(4.5);
countList(list, 1);
Double d = list.get(0); //what happens here?  You put an Integer in there!  class cast exception

その操作では、 Number のどのサブタイプが実際にそこにあるかは問題ではないため、リストをクリアできます。クリアです クリアです クリアです。

于 2012-06-20T02:34:56.403 に答える
2

問題は、タイプの消去のために、実行時にどのタイプの 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追加する必要がある場合は、メソッド宣言を次のように変更できます。

  1. メソッド宣言を次のように変更しますpublic static void countList( List<Number> list, int count )
  2. メソッドを に変更しpublic static void countList( List<? super Integer> list, int count )ます。

いずれにせよ、リストが宣言されているものと同じ型ではないものをリストに追加することは決してないので安心できるので、コンパイラは不平を言うのをやめます。

于 2012-06-20T02:55:13.810 に答える