Lassen Sie uns über den generischen Mechanismus von Java sprechen

王林
Freigeben: 2021-01-27 09:59:06
nach vorne
2107 Leute haben es durchsucht

Lassen Sie uns über den generischen Mechanismus von Java sprechen

Interviewer: Erzählen Sie mir, was der generische Mechanismus von Java ist.

(Teilen von Lernvideos:Java-Video-Tutorial)

Antwort der Lite-Version

Bei der Entwicklung von Java verfügt eine Klasse, Schnittstelle oder Methode unter Verwendung der Diamantsyntax über eine Gruppe von Klassen, die eine allgemeine Referenz als akzeptieren Parameter: Die generische Klasse wird letztendlich durch die Regeln in spitzen Klammern definiert. Die generische Klasse wird normalerweise durch einen Großbuchstaben dargestellt, normalerweise den Buchstaben T. Nach der späteren Kompilierung durch den Java-Compiler wird der generische Typ gelöscht und entsprechend ersetzt Die verwendete spezifische Klasse generiert Klassenbytecode, sodass Generika für Jvm transparent sind.

Antwort zur Deluxe-Version

Generika wurden offiziell in JDK1.5 eingeführt

Java führte den Hintergrund von Generika ein

Java-Sammlungen ermöglichen die Eingabe mehrerer Typen, wie zum Beispiel

List list=new ArrayList(); list.add("String"); list.add(1024);
Nach dem Login kopieren

Dies war vor JDK1.5 eine übliche Verwendung. Auch wenn es unter dem heutigen JDK platziert ist, ist es erlaubt, daher wird die Verwendung ähnlicher Sammlungen einige Probleme mit sich bringen, das heißt, welche Typen in der Sammlung platziert werden, weiß leider nur die Person, die die Sammlung erstellt hat, andere Anrufer können überhaupt nicht ermittelt werden. Daher ist es sehr wahrscheinlich, dass bei großen Projekten Probleme auftreten. Wenn der Aufrufer ein Objekt in der Sammlung zwangsweise überträgt, wird ein Fehler gemeldet Es wurde festgestellt, dass JDK Generika einführte, um ähnliche Probleme zu lösen.

Generischer Typ

Nach der Einführung von Generika ist es möglich, während der Kompilierungsphase zu überprüfen, ob der Typ den Anforderungen entspricht, wodurch eine blinde Typkonvertierung weitgehend entfällt. Generika funktionieren hauptsächlich im Compiler. Nach der Kompilierung kann die JVM keine Generika erkennen, wenn sie ausgeführt wird. Generika werden in gewöhnliche Generika und Wildcard-Generika unterteilt.

1. Gewöhnliche Generika

Wie der Name schon sagt, unterstützt diese Art von Generika die Übergabe aller Typen beim Aufruf, aber beim Aufruf müssen die Generika auf der linken und rechten Seite des Gleichheitszeichens konsistent sein. Die Raute auf der rechten Seite von JDK1.7 kann weggelassen werden.

class Test{...} //声明时 Test test = new Test(); //调用时 Test test = new Test(); //1.7调用时
Nach dem Login kopieren

3. Begrenzte Generika

//无界泛型,任意类型都匹配 //有界泛型 - 继承自某父类 //有界泛型 - 实现某接口 //有界泛型 - 多重边界 //有界泛型 - 指定类父类
Nach dem Login kopieren

Generika löschen

Generika funktionieren nur beim Schreiben von Code und beim Kompilieren, während die JVM-Ladeklasse beim Ausführen unempfindlich und transparent ist, da die Compiler-Generika beim Kompilieren gelöscht werden und im Großen und Ganzen werden die spitzen Klammern <> in der Klasse oder Methode entfernt und durch bestimmte Klassen gemäß den Regeln in den spitzen Klammern ersetzt, sodass der JVM überhaupt nicht ausgeführt wird Dies geschieht aus Kompatibilitätsgründen nur in JDK1.5. Auf diese Weise muss die vorhandene JVM nicht wesentlich geändert werden Art von Syntax, die der Compiler erkennen kann, die virtuelle Maschine jedoch nicht. Die Leute nennen diese Syntax Zucker (Suger). Nachdem der Compiler sie entfernt hat, überlässt er sie der virtuellen Maschine zur Ausführung.

(Empfohlenes Grafik-Tutorial:Java-Einführungs-Tutorial)

Generischer Löschmechanismus

//Pair的泛型 public class Pair { private T mFirst; private T mSecond; public T getmFirst() { return mFirst; } public void setmFirst(T mFirst) { this.mFirst = mFirst; } public T getmSecond() { return mSecond; } public void setmSecond(T mSecond) { this.mSecond = mSecond; } } //Pair的原始类型 //无论何时定义一个泛型类型,都会自动提供一个相应的 原始类型 public class Pair { private Object mFirst; private Object mSecond; public Object getFirst() { return mFirst; } public void setFirst(Object mFirst) { this.mFirst = mFirst; } public Object getSecond() { return mSecond; } public void setmSecond(Object mSecond) { this.mSecond = mSecond; } } //如果调用Pair编译擦除后得到如下= class Pair{ private String mFirst; private String mSecond; ... }
Nach dem Login kopieren

Wenn ein Generikum als Eingabeparameter einer Methode verwendet wird, wird es nach dem Löschen durch die Untergrenze eines Wildcard-Generikums ersetzt, z die Add-Methode

public static void insertElements(List list){ //Add进来的都是层级“小于等于”A的,也就是下界 list.add(new A()); list.add(new B()); list.add(new C()); }
Nach dem Login kopieren

Wenn ein Generic als Rückgabeparameter einer Methode verwendet wird, wird es nach dem Löschen durch die Obergrenze eines Wildcard-Generikums ersetzt, wie z. B. die Get-Methode

public void processElements(List elements){ //for循环挨个get list 里的数据,都当做A,也就是都当做上界 for(A a : elements){ System.out.println(a.getValue()); } }
Nach dem Login kopieren

Egal wie viel ich über den generischen Typ sage Löschung und wie viele Blogs ich lese, ist nicht so gut wie die offizielle Definition. Genau, hier ist ein Abschnitt des offiziellen Dokuments von Oracle zur Typlöschung

Das obige ist der detaillierte Inhalt vonLassen Sie uns über den generischen Mechanismus von Java sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.im
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!