2015-01-11 8 views
6

何が欠けていますか? Integer::toStringではなく、Object::toString以下を使用する必要があるのはなぜですか?ジェネリックでタイプ消去と関係がありますか?Java 8のメソッドリファレンスから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 
+2

ところであなただけの 'は、Arrays.asList(1,2,3)を書くことができます

コンパイラは、あなたがこれを実行したい場合は知りません。 forEach(System.out :: println);または 'Stream.of(1,2,3).forEach(System.out :: println);または' IntStream.rangeClosed(1,3).forEach(System。 out :: println); –

+0

[Java8メソッドのリファレンス(整数のtoString)であいまい型を修正する方法](http://stackoverflow.com/questions/21873829/how-to-fix-ambigous-type -on-java8-メソッド参照ce-tostring-of-an-integer) – Holger

答えて

13

これはタイプ消去とは関係ありません。エラーメッセージで

ルック:

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

Integerクラスはmap()方法で期待機能インターフェースと一致2つのtoString方法を有しています。 1つは、int引数を持つ静的で、もう1つはObjecttoString()を上書きするtoString()メソッドです。

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); 
+1

に1を加えたもの。 –

+1

説明[ここ]であいまいではない、 'IntStream.of(1,2,3).mapToObj(Integer :: toString).forEach(System.out :: println);'を使うことができます(http:// stackoverflow .com/a/21876077/2711488)。 – Holger

+0

しかし私は別のエラーメッセージを受け取ります(そして、どうして私は何が起こっているのか理解できませんでした)。 IDEで取得したエラーメッセージは、「ストリーム内のmap(java.util.function.Function <?super java.lang.Integer、?extends R>)を()に適用できません。 。誰がそれを作ることができますか? – sat

関連する問題