Génériques Java (Notes)

Avoir une liste dans la valeur de la carte

demande: La valeur de Map est List, et l'objet géré par cette List a une relation de «Child extend Parent». Ensuite, il y a une instance de chaque List , et je souhaite traiter les objets de la List en tant que parents.

problème

Les génériques ne sont pas covariants, vous ne pouvez donc pas:

Map<Key, List<Parent>> map1;
Map<Key, List<Child>> map2;
list1 = list2;  //Erreur de compilation ici

Par conséquent, nous utilisons des caractères génériques. Cependant, ce qui suit est également NG

Map<Key, List<? extends Parent>> map1;
Map<Key, List<Child>> map2;
list1 = list2; //Erreur de compilation ici

c'est,

List<? extends Parent> list1;
List<Child> list2;
list1 = list2;

Je pouvais le faire, mais je pensais que c'était étrange. Et ce qui suit est la bonne réponse

Map<Key, ? extends List<? extends Parent>> map1;
Map<Key, List<Child>> map2;
map1 = map2;

Comme vous pouvez le voir, j'ai dû utiliser le joker deux fois. Je l'ai utilisé pour définir une méthode et l'exécuter.

  List<Integer> ilist = new ArrayList<Integer>();
  ilist.add(1);
  ilist.add(2);
  ilist.add(3);			
		
  Map<String, List<Integer>> imap = new HashMap<String, List<Integer>>();
  imap.put("1", ilist);
  doit(imap);

  public void doit(Map<String, ? extends List<? extends Number>> inmap) {
      for (String key : inmap.keySet()) {
          System.out.println("key = " + key);
          List<? extends Number> list = inmap.get(key);
          for (Number n : list) {
              System.out.println(n);
          }
      } 
  }

prime:

Une méthode qui retourne une carte avec List <Parent> comme valeur de List <Child>

Partie 1

public <V, K extends T, T> Map<V, List<? extends T>> convert(Map<V, List<K>> srcMap) {
    Map<V, List<? extends T>> dstMap = new HashMap<V, List<? extends T>>();
    for (V key : srcMap.keySet()) {
        dstMap.put(key, srcMap.get(key));
    }
    return dstMap;
}

Partie 2

public <V, K extends T, T> Map<V, List<T>> toUpper(Map<V, List<K>> srcMap) {
    Map<V, List<T>> dstMap = new HashMap<V, List<T>>();
        for (V key : srcMap.keySet()) {
	    List<T> tlist = new ArrayList<T>();
	    for (K val : srcMap.get(key)) {
		tlist.add(val);
	    }
	    dstMap.put(key, tlist);
	}
	return dstMap;
}

Le "n ° 2" est probablement meilleur. La raison est que le type de retour est «Map <V, List >». Selon Effective Java, il n'est pas bon de rendre cette méthode consciente des caractères génériques du côté exécution (par exemple, List <? Etend T>) comme dans la "Partie 1" (probablement ...).

Veuillez signaler toute erreur.

Recommended Posts

Génériques Java (Notes)
note java
[Java] Génériques
Résumé des génériques Java
[Java] Exemple de génériques
[Java] Note sur le tableau
[Java] Notes d'étude
Notes de sérialisation Java
[Java] Remarque sur les collecteurs de flux
Sortie au format Java [Note]
[Java] Note sur la syntaxe de contrôle
Notes de révision de Java NIO 2
Génériques Java fréquemment utilisés
[Java] Notes de méthode de base
Essayez de gratter en utilisant Java [Note]
[Java] Classe générique et méthode générique
[Implémentation] Notes de classe de processus java
Notes de révision de Java Collections Framework
Java
java Generics T et? Différence
Java
[Java] Types de base et notes d'instructions
Efficacité de Java 3rd Edition Chapitre 5 Génériques
Remarques sur le contrôle du signal en Java
[Java] Essayez de mettre en œuvre à l'aide de génériques
Java Generics (définit les classes et les méthodes)
Remarques sur le traitement des threads Android (java)
Génériques Kotlin pour les développeurs Java
Remarques sur le chemin et le package Java
Étudier Java ―― 3
[Java] tableau
Java protégé
[Java] Annotation
Module [Java]
Tableau Java
Étudier Java ―― 9
Java scratch scratch
Astuces Java, astuces
Méthodes Java
Méthode Java
java (constructeur)
Tableau Java
[Java] ArrayDeque
java (remplacement)
java (méthode)
Journée Java 2018
Chaîne Java
JUnit 4 notes
java (tableau)
Java statique
Sérialisation Java
java débutant 4
JAVA payé
Étudier Java ―― 4
tri shell java
[Java] compareTo
java réfléchissant 获 获 举
java (interface)
Mémorandum Java
Tableau Java