2015-01-11 15 views
6

Cosa mi manca? Perché devo usare Object::toString qui sotto e non Integer::toString? Ha qualcosa a che fare con la cancellazione dei caratteri con i generici?Invocazione di toString tramite metodo di riferimento in 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 si può semplicemente scrivere 'Arrays.asList (1,2,3). forEach (System.out :: println); 'o' Stream.of (1,2,3) .forEach (System.out :: println); 'o' IntStream.rangeClosed (1, 3). forEach (Sistema. out :: println); ' –

+0

possibile duplicato di [Come risolvere il tipo ambiguo sul riferimento al metodo Java8 (toString di un intero)] (http://stackoverflow.com/questions/21873829/how-to-fix-ambigous-type -on-java8-metodo-riferimen ce-tostring-of-an-integer) – Holger

risposta

13

Questo non ha nulla a che fare con la cancellazione del tipo.

Guardate il messaggio di errore:

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

La classe Integer ha due toString metodi che corrispondono l'interfaccia funzionale previsto dal metodo map(). Uno è statico con un argomento int e l'altro è il metodo toString() che sovrascrive lo toString() .

Il compilatore non sa se si desidera eseguire questo:

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

o questo:

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

più uno, ben coperto. –

+1

È possibile utilizzare 'IntStream.of (1, 2, 3) .mapToObj (Integer :: toString) .forEach (System.out :: println);' che non è ambiguo come spiegato [qui] (http: // stackoverflow .com/a/21876077/2711,488 mila). – Holger

+0

Ricevo però un messaggio di errore diverso (e forse perché non sono riuscito a capire cosa stava succedendo). Il messaggio di errore che viene visualizzato (nell'IDE) dice: "map (java.util.function.Function ) in Stream non può essere applicato a ()" . Cosa può fare qualcuno di ciò? – sat

Problemi correlati