2017-08-08 4 views
0

J'ai toujours utilisé des génériques et j'ai toujours vu les chevrons utilisés comme ceci: Class<Type> (par exemple List<String>).Génère les chevrons avant l'appel de la fonction statique

Aujourd'hui j'ai rencontré une spécification de génériques avant l'appel d'une méthode statique comme: Class.<TypeA, TypeB>staticCall(). Le vrai exemple est: ImmutableMap.<String, String>builder().

Je n'ai jamais vu cette utilisation et je ne trouve pas cette utilisation spécifique dans le documentation. Quelqu'un peut-il expliquer ce qui se passe, s'il vous plaît?

+1

Il est une méthode statique générique, voir la réponse ici: https://stackoverflow.com/questions/27166610/what-does-the-dot-operator-before-the- generic-parameter-mean –

+0

Oh, oui, c'était ce que je cherchais!Je n'ai pas pensé à chercher le. opérateur au lieu des génériques après cela. Peut-être laisser ouvert pour les gens qui vont chercher cela de la même manière? –

Répondre

1

Ceux-ci sont appelés Generic Methods.

Avant Java 7 vous avait pour spécifier le type de la référence générique:

Util.<Integer, String>compare(p1, p2); 

Maintenant, le compilateur déduit le type du contexte.

+0

Mmm, je suis sur Java 8 et je dois encore spécifier la référence générique. : confused: –

+1

veuillez lire [this] (https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html). –

-1

Cela signifie plusieurs types. Liste prend seulement un type générique qui est la raison pour laquelle vous voyez

List<String> 

De la documentation java pour Map

En haut, vous verrez: Interface Carte

donc il faut deux generic types. Dans l'exemple de votre carte immuable, il est dit que le K (ey) est une chaîne et V (alue) est aussi une chaîne.

Dans le lien que vous avez fourni, il mentionne que cela est possible en vertu de la section,

une version générique de la classe Box

+0

Peut-être que je devais spécifier cela, je sais que vous pouvez spécifier 2 types. Je ne savais pas que vous pouvez spécifier cela avant un appel de méthode. :) –

+0

Je pense que vous tapez la classe sur laquelle vous appelez la méthode statique - la classe Immutable Map elle-même est spécifique à une clé et à une valeur typées. Vous référencez toujours le nom de la classe avant d'appeler la méthode statique, dans ce cas, le nom de la classe inclut uniquement les implémentations de type générique. –

0

nous pouvons également définir des génériques au niveau de la classe. ImmutableMap.Builder signifie que Builder est une classe interne statique ici.

et les méthodes Builder auront K et V comme arguments des moyens

plutôt comme un moyen fournissant mettre (String, String) il fournit methos comme mis (K, V), de sorte que tout type peut être ajouté à l'aide mis et si vous vous avez besoin d'utiliser le même type.

par exemple si votre appellent Builder.Put par chaîne passant, String puis dans get on peut directement attribuer à chaîne

chaîne val = Bullder.get (K);

cela signifie que toutes les méthodes de ImmutableMap.Builder fonctionneront pour n'importe quel type de classe.

c'est la puissance des génériques, ce qui signifie pas besoin de surcharger les méthodes pour différents types. définissent comme ci-dessous:

public Builder<K, V> put(K key, V value) { 
    ensureCapacity(size + 1); 
    ImmutableMapEntry<K, V> entry = entryOf(key, value); 
    // don't inline this: we want to fail atomically if key or value is null 
    entries[size++] = entry; 
    return this; 
}