12

私は何が欠けていますか?Object::toStringではなく以下を使用する必要があるのはなぜInteger::toStringですか? ジェネリックによる型消去と関係がありますか?

Arrays.asList(1,2,3).stream().map(Integer::toString).forEach(System.out::println); //Won't compile

Arrays.asList(1,2,3).stream().map(Object::toString).forEach(System.out::println); //Compiles and runs fine
4

1 に答える 1

23

これは型消去とは関係ありません。

エラーメッセージを見てください:

(argument mismatch; invalid method reference
  reference to toString is ambiguous
    both method toString(int) in Integer and method toString() in Integer match)

このIntegerクラスには、メソッドtoStringが期待する機能インターフェイスと一致する 2 つのメソッドがありますmap()int1 つは引数付きの static で、もう 1 つはのtoString()をオーバーライドするメソッドです。ObjecttoString()

コンパイラは、これを実行するかどうかを知りません:

Arrays.asList(1,2,3).stream().map(i->Integer.toString(i)).forEach(System.out::println);

またはこれ:

Arrays.asList(1,2,3).stream().map(i->i.toString()).forEach(System.out::println);
于 2015-01-11T08:04:48.210 に答える