web-dev-qa-db-fra.com

Expliquez la syntaxe des collections. <String> emptyList ()

Je viens d'étudier la programmation générique, l'interface List<E> Et ArrayList, donc je peux comprendre la déclaration ci-dessous.

ArrayList<String> list = new ArrayList<String>();

Mais je ne comprends pas la prochaine déclaration que j'ai vue en surfant sur le Web.

List<String> list2 = Collections.<String>emptyList();
  1. Qu'est-ce que Collections? Pourquoi n'est-ce pas Collections<E> Ou Collections<String>?
  2. Pourquoi <String> Est placé avant le nom de la méthode emptyList?

(Est-ce que emptyList<String>() n'est pas correct pour Generic?)

  1. Que signifie la déclaration?
70
Jenix

Cette ligne crée une liste vide de chaînes en appelant une méthode statique avec un paramètre de type générique.

À l'intérieur de la classe Collections, il y a une méthode statique emptyList déclarée comme:

public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

Cela a un paramètre de type générique T. Nous appelons cette méthode en utilisant:

List<String> list = Collections.emptyList();

et T est inféré être un String en raison du type de list.

Nous pouvons également spécifier le type de T en le mettant entre crochets lors de l'appel de emptyList. Cela peut être nécessaire si nous voulons un type plus spécifique que ce qui est déduit:

List<? extends Object> list = Collections.<String>emptyList();

emptyList<String>() n'est pas correct car ce placement n'est valide que lors de la création d'instances de classes génériques, et non d'appels de méthodes. Lorsque vous utilisez new, il existe deux paramètres de type possibles, ceux qui précèdent le nom de la classe sont réservés au constructeur et ceux qui se trouvent après le nom de la classe sont pour l'instance entière, donc avec la classe:

class MyClass<A> {
    public <B> MyClass(A a, B b) {
        System.out.println(a + ", " + b);
    }
}

Nous pouvons appeler son constructeur où A est String et B est Integer comme:

MyClass<String> a = new <Integer>MyClass<String>("a", 3);

ou en utilisant l'inférence de type:

MyClass<String> a = new MyClass<>("a", 3);

Voir aussi:

58
fgb

Qu'est-ce que Collections? Pourquoi n'est-ce pas Collections<E> Ou Collections<String>?

Collections est une classe JDK.

Cette classe se compose exclusivement de méthodes statiques qui opèrent ou retournent des collections. Il contient des algorithmes polymorphes qui fonctionnent sur les collections, des "wrappers", qui renvoient une nouvelle collection soutenue par une collection spécifiée, et quelques autres bric et de broc.

Ce n'est pas générique et ne peut pas être instancié.

Pourquoi <String> Est placé avant le nom de la méthode emptyList?

Collections#emptyList est une méthode générique. Ici, nous spécifions explicitement un argument de type, String.

(Est-ce que emptyList<String>() n'est pas correct pour Generic?)

Non, en Java, les arguments de type générique pour les méthodes précèdent le nom de la méthode.

Que signifie la déclaration?

Nous invoquons la méthode statique emptyList et assignons sa valeur de retour à une variable de type List<String>.

11

En bref, cela crée une liste de chaînes vide et immuable.

Regardons l'expression petit à petit.

Collections est le nom d'une classe. De la Javadoc :

Cette classe se compose exclusivement de méthodes statiques qui opèrent ou retournent des collections. Il contient des algorithmes polymorphes qui fonctionnent sur les collections, des "wrappers", qui renvoient une nouvelle collection soutenue par une collection spécifiée, et quelques autres bric et de broc.

emptyList() est le nom d'une méthode statique définie dans la classe Collections ( Javadoc ). Il s'agit d'une méthode générique et le <String> Dans Collections.<String>emptyList() spécifie l'argument de type générique.

La méthode renvoie un List<T>, Qui dans ce cas est List<String>: Une liste de chaînes. Plus précisément, il renvoie une liste de chaînes vide, immuable.

9
NPE

1.Collection est une interface et les collections sont une classe statique composée exclusivement de méthodes statiques qui opèrent ou retournent des collections. Par conséquent, nous ne pouvons pas utiliser Collections<E> ou Collections<String>.

2 .<String> avant emptyList (utilisé pour obtenir la liste vide qui est immuable) indique que seules des valeurs String peuvent y être ajoutées. Comme:

list2.add("A");
list2.add("B");

3.L'instruction signifie qu'elle va créer une liste vide immuable de type Liste.

Vous pouvez consulter ce lien: Différence entre Java Collection et Collections

6
Leo

Premièrement, Collections est une bibliothèque d'aide de méthodes statiques qui opèrent sur différents types de collections. Si vous avez fait n'importe quelle programmation C++, c'est très synonyme de la bibliothèque de fonctions <algorithm>.

Dans ce cas, vous invoquez la méthode statique emptyList(), qui renvoie une liste vide d'un type particulier. Étant donné que ces méthodes nécessitent toujours un type, mais que les méthodes Collections 'peuvent faire référence à de nombreux types, vous devez spécifier le type lors de l'invocation.

Pour appeler une méthode générique , vous devez l'appeler avec la liste des paramètres (ie <String>) avant le nom de la méthode, mais après le point.

List<String> someList = Collections.<String>emptyList();
6
Qix