Programmation générique java

Qu'est-ce que la programmation générique?

Lors de la programmation, je souhaite implémenter des classes et des méthodes avec plusieurs types. Il est facile de voir, par exemple, qu'il est ridicule d'implémenter ArrayList pour int, pour double et pour String. Très utile. Créer une classe ou une méthode avec plusieurs paramètres de type inclus dans \ <> comme ArrayList \ <T > est appelé Programmation générique.

Constitution

Cet article explique d'abord l'implémentation de base et l'utilisation de GenericClass et GenericMethod. Ensuite, il explique comment limiter GenericPrograming et comment le gérer de manière flexible. Enfin, il résume les points à noter sur GenericProgramming en Java.

Generic Class Une implémentation simple de Generic Class.

Entry.java


public class Entry<K, V>{ // point 1
  private K key;  // point 2
  private V value;

  public Entry(K key, V value){  // point 2
    this.key=key;
    this.value=value;
  }

  public K key(){return key;} // point 2
  public V value(){return value;}
}
  1. Lors de la définition d'une classe, déclarez plusieurs paramètres de type entre \ <> à côté du nom de la classe. K et V sont déclarés dans Entry, mais K et V n'ont aucune signification. Convention Java Utilisez les lettres T, E, K, V, X, R, U, T1, T2 pour le paramètre de type dans.
  2. Les paramètres de type peuvent être utilisés comme types de retour pour les variables membres, les constructeurs et les méthodes d'instance.

Client.java


Entry<Integer, String> id = new Entry<String, Integer>(1001, "hitoshi watanabe"); //1
Entry<Integr, String> id2 = new Entry<>(1002, "taro yamada"); //2
var id3 = new Entry<Integer, String>(1003, "hideo kojima"); //3
  1. Voici le prototype.
  2. Si vous déclarez un paramètre de type sur le côté gauche, le compilateur déduit le paramètre de type sur le côté droit. 3.2 Le contraire de 2, la méthode d'écriture dans laquelle le compilateur déduit le côté gauche.

Les types primitifs ne peuvent pas être utilisés pour les paramètres de type, donc des entiers encadrés sont utilisés à la place des entiers.

Generic Method Les paramètres de type dépendent de l'instance, donc si vous souhaitez utiliser des paramètres de type dans une méthode statique, vous devez déclarer des paramètres de type indépendants de l'instance.

Arrays.java


public class Arrays {
  public static <T> void swap(T[] array, int i, int j){ // point 1
    T tmp = array[i];  //point 2
    array[i]=array[j];
    array[j]=tmp;
  }
}
  1. Lors de la déclaration de GenericMethod, spécifiez le paramètre type avec \ <> avant le type de retour.
  2. Les paramètres de type peuvent être traités comme des types dans GenericMethod.

Client.java


String[] member = ...;
Arrays.<String>swap(member, 0, 1); //1
Arrays.swap(member, 0, 1); //2
  1. Ceci est le prototype
  2. Le compilateur déduit le paramètre de type d'échange à partir du premier membre d'argument

Restrictions de programmation générique

Des opérations suffisamment abstraites comme Array.swap peuvent déclarer un paramètre de type appelé \ <T > qui ne limite pas le type. Mais lorsque vous souhaitez effectuer des opérations plus restrictives, remplissez les conditions requises pour le paramètre de type Il est nécessaire de définir une limite pour que seuls les sous-types du type soient inclus. À titre d'exemple, nous présenterons l'implémentation lorsque vous souhaitez fermer tous les éléments en prenant ArrayList de la classe qui implémente l'interface AutoClosable comme argument.

Sample1.java


public static <T extends AutoClosable> void closeAll(ArrayList<T> elems) throws Exception{ // point 1
  for(T e : elems) e.close(); // point 2
}
  1. Vous pouvez limiter les paramètres de type à Tout qui implémente une interface avec \ <Tout étend l'interface / classe >, ou Tout qui hérite d'une classe. Par conséquent, cette méthode générique ne peut faire des paramètres de type qu'un sous-type de Fermeture automatique.
  2. Puisqu'il est garanti que le paramètre type de ce GenericMethod implémente AutoClosable, la méthode close fournie par AutoClosable peut être appelée.

Lorsque \ <T > est déclaré, le compilateur complète \ <T étend Object >. En java, toutes les classes ont une classe Object dans leurs ancêtres, donc les méthodes fournies par la classe Object peuvent être utilisées.

La méthode closeAll n'a pas besoin d'être GenericMethod

Sample.java


public static void closeAll(AutoClosable[] elems){
  for(AutoClosable e : elems) e.close();
}

##Flexibilité accrue dans la programmation générique
Lorsque vous souhaitez implémenter une méthode qui prend une instance avec un paramètre de type comme argument,Sous-type d'instance à prendre comme argument,Il est normal de vouloir également autoriser les supertypes comme arguments..pourtant,


#### **`BadSample.java`**
```java

public static void printName(ArrayList<Employee> staff){
  for(Employee e : staff) System.out.println(e.getName());
} 

BadSample.ArrayList comme argument comme javaQuand,Seul le type ArrayList de type Employee peut être accepté comme argument.En d'autres termes,ArrayList des instances de sous-classe qui héritent de Employee ne peut pas être utilisé avec cette méthode.Ce n'est pas assez de flexibilité comme méthode, nous utilisons donc le concept de WildCard.. Il existe 3 types de Wild Cards,Expliquez chacun.

###SubType WildCard BadSample.En java, je ne pouvais pas prendre une classe qui héritait de Employee comme argument.,Le caractère générique de sous-type est utilisé pour résoudre ce problème..

Sample2.java


public static void printName(ArrayList<? extends Emplyee> staff){ // point 1
  for(Employee e : staff) System.out.println(e.getName());
}

<? extends hoge>Acceptera une instance du paramètre de sous-type de hoge comme argument.le sous-type hoge peut être traité comme hoge dans le polymorphisme.À ce moment-là,Si la méthode utilisée est remplacée,La méthode remplacée est appelée.

Recommended Posts

Programmation générique java
bases de la programmation Java
Histoire générique Java
Bases de la programmation Java Practice-array
Programmation Java (structure de classe)
Tout sur la programmation Java
mémo de programmation du concours java
Thread de programmation Java exécutable
Programmation Java incroyable (arrêtons-nous)
Programmation Java (variables et données)
Bases du développement Java-Pratique ③ Programmation avancée-
Instruction pratique de base de la programmation Java
Java
Instruction de base de la programmation Java Practice-Switch
Java
[Java] Termes de base en programmation
Aide-mémoire privé pour la programmation compétitive (Java)
Cahier d'exercices de programmation de fonctions Java --zipWith-
Résumé de la programmation orientée objet utilisant Java
Apprendre Java (0)
Étudier Java ―― 3
[Java] tableau
Java protégé
[Java] Annotation
Module [Java]
Tableau Java
Étudier Java ―― 9
Java scratch scratch
Astuces Java, astuces
Utilisez OpenCV_Contrib (ArUco) avec Java! (Partie 2-Programmation)
Méthodes Java
Méthode Java
java (constructeur)
Tableau Java
java (remplacement)
java (méthode)
Journée Java 2018
Chaîne Java
Programmation orientée objet
Java statique
Sérialisation Java
java débutant 4
JAVA payé
Étudier Java ―― 4
Java (ensemble)
[Java] compareTo
Étudier Java -5
Formation des nouveaux arrivants à l'aide de la programmation Web-Basic à l'aide de Java-
java réfléchissant 获 获 举
java (interface)
Mémorandum Java
Tableau Java
[Java] Array
Étudier Java # 0
Revue Java
framework java
Fonctionnalités Java
[Java] Héritage
FastScanner Java
Fonctionnalités Java