の数があるとしList
ます。の値はなどList
の型Integer
にすることができます。そのような を宣言する場合、ワイルドカード ( ) を使用して宣言することも、ワイルドカードを使用せずに宣言することもできます。Double
List
?
final List<Number> numberList = Arrays.asList(1, 2, 3D);
final List<? extends Number> wildcardList = Arrays.asList(1, 2, 3D);
だから、今私はを使いたいと思っていstream
ます(明らかに、以下のコードは問題を説明するための単なる例です)。ストリーミングすることから始めましょう:List
collect
Map
Collectors.toMap
numberList
final List<Number> numberList = Arrays.asList(1, 2, 3D, 4D);
numberList.stream().collect(Collectors.toMap(
// Here I can invoke "number.intValue()" - the object ("number") is treated as a Number
number -> Integer.valueOf(number.intValue()),
number -> number));
しかし、私は同じ操作を行うことができませんwildcardList
:
final List<? extends Number> wildCardList = Arrays.asList(1, 2, 3D);
wildCardList.stream().collect(Collectors.toMap(
// Why is "number" treated as an Object and not a Number?
number -> Integer.valueOf(number.intValue()),
number -> number));
number.intValue()
コンパイラは、次のメッセージでの呼び出しに文句を言います。
Test.java: シンボルが見つかりません
symbol: メソッド intValue()
場所: java.lang.Object 型の変数番号
コンパイラ エラーから、ラムダ内の が としてではなくnumber
として扱われることは明らかです。Object
Number
だから、今私の質問に:
- のワイルドカード バージョンを収集すると、ワイルドカードを
List
使用しないバージョンの のように機能しないのはなぜList
ですか? - ラムダの変数がではなく
number
と見なされるのはなぜですか?Object
Number