2015-01-11 11 views
6

Czego mi brakuje? Dlaczego muszę używać Object::toString poniżej, a nie Integer::toString? Czy ma to coś wspólnego z wymazywaniem typów z rodzajami?Wywoływanie doString za pomocą odwołania do metody w języku Java 8

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

BTW można po prostu napisać 'Arrays.asList (1,2,3). forEach (System.out :: println); 'lub' Stream.of (1,2,3) .forEach (System.out :: println); 'lub' IntStream.rangeClosed (1, 3) .forEach (System. out :: println); ' –

+0

możliwy duplikat [Jak naprawić błędny typ w odniesieniu do metody Java8 (toString of Integer)] (http://stackoverflow.com/questions/21873829/how-to-fix-ambigous-type -on-java8-method-referen ce-tostring-of-an-integer) – Holger

Odpowiedz

13

Nie ma to nic wspólnego z typem wymazania.

Spójrz na komunikat o błędzie:

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

Klasa Integer ma dwa toString metod, które odpowiadają oczekiwanej metodą map() interfejs funkcjonalny. Jedna jest statyczna z argumentem int, a druga to metoda toString(), która przesłania Object 's toString().

Kompilator nie wie, czy chcesz wykonać to:

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

lub to:

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

plus jeden, dobrze zakryty. –

+1

Możesz użyć 'IntStream.of (1, 2, 3) .mapToObj (Integer :: toString) .forEach (System.out :: println);' który nie jest niejednoznaczny jak wyjaśniono [tutaj] (http: // stackoverflow .com/a/21876077/2711488). – Holger

+0

Otrzymałem jednak inny komunikat o błędzie (i być może dlatego nie mogłem zrozumieć, co się dzieje). Komunikat o błędzie, który otrzymuję (w IDE) czyta - "map (java.util.function.Function ) w strumieniu nie może być zastosowany ()" . Co każdy może z tego zrobić? – sat