Vraag Hoe dubbel ambigu vast te stellen op methode referentie (toString van een Integer)?


Wanneer dit gebeurt

Stream.of(1, 32, 12, 15, 23).map(Integer::toString);

Ik krijg een dubbelzinnige typefout. Het is begrijpelijk dat de compiler niet weet of ik het meen toString(int) of toString() van Integer.

Als ik geen methode-verwijzing gebruik, ben ik hier misschien uit gekomen met een expliciete cast of schrijf ik de generieke hand lang op, maar hoe kan ik de compiler laten weten wat ik hier bedoel? Welke syntaxis (indien aanwezig) kan ik gebruiken om ondubbelzinnig te maken?


24
2018-02-19 07:28


oorsprong


antwoorden:


Er is geen manier om verwijzingen naar methoden ondubbelzinnig te maken; Eenvoudig gezegd zijn verwijzingen naar methoden een functie die alleen wordt ondersteund voor ondubbelzinnige verwijzingen naar methoden. Dus je hebt twee oplossingen:

  1. gebruik een lambda-uitdrukking:

    Stream.of(1, 32, 12, 15, 23).map(i->Integer.toString(i));
    
  2. (liever, althans door mij) Gebruik een stroom primitief int waarden wanneer de bron uit primitief bestaat int alleen waarden:

    IntStream.of(1, 32, 12, 15, 23).mapToObj(Integer::toString);
    

    Dit gebruikt de statische Integer.toString(int) methode voor het consumeren van de int waarden.


31
2018-02-19 09:25



Uw belangrijkste opties, met behulp van methodeverwijzingen, zijn:

Stream.of(1, 32, 12, 15, 23).map(String::valueOf);
IntStream.of(1, 32, 12, 15, 23).mapToObj(Integer::toString);

Je huidige versie zou kunnen betekenen i -> i.toString() of i -> Integer.toString(i).


15
2018-02-19 10:02



Sinds Integer.toString() overschrijvingen Object.toString(), in dit geval zou je het als volgt kunnen repareren:

Stream.of(1, 32, 12, 15, 23).map(Object::toString);

14
2017-07-25 07:13