2017-09-12 9 views
0

Généralement, une déclaration de méthode affiche son type de retour, son chemin complet et ses paramètres. Mais quand je regarde la méthode java.util.stream.Stream.collect je suis confus.Comprendre la déclaration d'une méthode d'opération de terminal

Il semble que la méthode a deux types de retour:

<List<Integer>, Object> List<Integer> java.util.stream.Stream.collect(Collector<? super Integer, Object, List<Integer>> collector) 

Je comprends que le type réel de retourest List<Integer>, mais qu'est-ce que <List<Integer>, Object> signifie? Pourquoi est-ce un espace avant List<Integer> et pourquoi sa clé (si c'est une carte?) Est-elle la même que le type de retour réel?

+1

La première chose n'est pas un type de retour, il spécifie des types pour les paramètres de type génériques R et A. Lire javadoc pourrait aider ici. La méthode renvoie R, le type de retour doit donc être identique au paramètre de type –

Répondre

1

Jetez un oeil à la déclaration de la méthode:

public interface Stream<T> extends BaseStream<T, Stream<T>> { 
    ... 
    /* ... 
    * @param <R> the type of the result 
    * @param <A> the intermediate accumulation type of the {@code Collector} 
    * ... 
    */ 
    <R, A> R collect(Collector<? super T, A, R> collector); 
    ... 
} 

Comme Nathan a souligné dans les commentaires, le <R, A> indique les paramètres de type générique. Ceux-ci seront déduits par le compilateur Java tant qu'il n'est pas ambigu. Dans votre cas R a été inféré à List<Integer> et A à Object. Vous pouvez lire here sur les méthodes génériques.

+0

Lecture à partir de ces liens https://docs.oracle.com/javase/tutorial/java/generics/methods.html, http: // docs .oracle.com/javase/tutoriel/java/generics/boundedTypeParams.html et http://docs.oracle.com/javase/tutorial/extra/generics/methods.html après la réponse, je comprends maintenant. – fall