Explication détaillée des génériques en Java
Les soi-disant génériques : ils permettent de spécifier des paramètres de type lors de la définition des classes et des interfaces. Ce paramètre de type sera déterminé lors de la déclaration des variables et de la création d'objets (c'est-à-dire en transmettant des paramètres de type réels, qui peuvent également être appelés arguments de type).
Classe ou interface générique
Syntaxe "Diamond"
//定义 public interface List<E> extends Collection<E> public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable //使用 List<String> list = new ArrayList(); //Java7以后可以省略后面尖括号的类型参数 List<String> list = new ArrayList<>();
Dérivation d'une sous-classe à partir d'une classe générique
//方式1 public class App extends GenericType<String> //方式2 public class App<T> extends GenericType<T> //方式3 public class App extends GenericType
Pseudo-générique
Il n'y a pas de véritable classe générique. Les classes génériques sont transparentes pour la machine virtuelle Java. La JVM ne connaît pas l'existence des classes génériques et des classes ordinaires. Par conséquent, les paramètres de type ne sont pas autorisés dans les méthodes statiques, les blocs d’initialisation statiques et les variables statiques.
- Les méthodes suivantes sont toutes fausses
private static T data; static{ T f; } public static void func(){ T name = 1; }
L'exemple suivant peut vérifier de côté qu'il n'y a pas de classe générique
public static void main(String[] args){ List<String> a1 = new ArrayList<>(); List<Integer> a2 = new ArrayList<>(); System.out.println(a1.getClass() == a2.getClass()); System.out.println(a1.getClass()); System.out.println(a2.getClass()); }
Sortie
true class java.util.ArrayList class java.util.ArrayList
Tapez le caractère générique
Tout d'abord, il doit être clair que si Foo est la classe parent de Bar, mais List
Les méthodes suivantes compileront les erreurs :
List<?> list = new ArrayList<>(); list.add(new Object());
Quelques idées :
1. Les objets List
2. Les tableaux et les génériques sont différents : en supposant que Foo est un sous-type (sous-classe ou sous-interface) de Bar, alors Foo[] est toujours un sous-type de Bar[] mais G
3. Afin de représenter la classe parent de diverses listes génériques, nous devons utiliser des caractères génériques de type est un point d'interrogation (?). , écrivant : List< ?> (signifiant Liste d'éléments de type inconnu). Ce point d'interrogation (?) est appelé caractère générique et son type d'élément peut correspondre à n'importe quel type.
La limite supérieure des caractères génériques
List extends SuperType> représente la classe parent de toutes les listes génériques SuperType ou elle-même. Les génériques avec des limites supérieures génériques ne peuvent pas avoir de méthodes définies, ils obtiennent uniquement des méthodes.
Définir la limite supérieure des caractères génériques peut résoudre les problèmes suivants : Dog est une sous-classe d'Animal, et il existe une méthode getSize pour obtenir le nombre de listes entrantes. Le code est le suivant
abstract class Animal { public abstract void run(); } class Dog extends Animal { public void run() { System.out.println("Dog run"); } } public class App { public static void getSize(List<Animal> list) { System.out.println(list.size()); } public static void main(String[] args) { List<Dog> list = new ArrayList<>(); getSize(list); // 这里编译报错 } }
修饰符 返回值类型 方法名(类形列表){ //方法体 }
public static <T> void copy(List<? super T> dest, List<? extends T> src){ ...}
class Apple<T extends Number> { T size; public Apple() { } public Apple(T size) { this.size = size; } public void setSize(T size) { this.size = size; } public T getSize() { return this.size; } } public class ErasureTest { public static void main(String[] args) { Apple<Integer> a = new Apple<>(6); // ① // a的getSize方法返回Integer对象 Integer as = a.getSize(); // 把a对象赋给Apple变量,丢失尖括号里的类型信息 Apple b = a; // ② // b只知道size的类型是Number Number size1 = b.getSize(); // 下面代码引起编译错误 Integer size2 = b.getSize(); // ③ } }

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Le chargement de classe de Java implique le chargement, la liaison et l'initialisation des classes à l'aide d'un système hiérarchique avec Bootstrap, Extension et Application Classloaders. Le modèle de délégation parent garantit que les classes de base sont chargées en premier, affectant la classe de classe personnalisée LOA

L'article examine la mise en œuvre de la mise en cache à plusieurs niveaux en Java à l'aide de la caféine et du cache de goyave pour améliorer les performances de l'application. Il couvre les avantages de configuration, d'intégration et de performance, ainsi que la gestion de la politique de configuration et d'expulsion le meilleur PRA

L'article discute de l'utilisation de JPA pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux. Il couvre la configuration, la cartographie des entités et les meilleures pratiques pour optimiser les performances tout en mettant en évidence les pièges potentiels. [159 caractères]

L'article discute de l'utilisation de Maven et Gradle pour la gestion de projet Java, la construction de l'automatisation et la résolution de dépendance, en comparant leurs approches et leurs stratégies d'optimisation.
