Heim  >  Artikel  >  Java  >  Verbesserungen an generischen Zieltyp-Inferenzmethoden in Java 8

Verbesserungen an generischen Zieltyp-Inferenzmethoden in Java 8

高洛峰
高洛峰Original
2017-01-18 11:12:001392Durchsuche

1. Ein einfaches Verständnis von Generika

Generika sind eine neue Funktion von Java SE 1.5. Das Wesentliche von Generika ist ein parametrisierter Typ, was bedeutet, dass der zu bedienende Datentyp als Parameter angegeben wird. Der beliebte Punkt ist „Typvariable“. Variablen dieses Typs können bei der Erstellung von Klassen, Schnittstellen und Methoden verwendet werden.

Der einfachste Weg, Java-Generika zu verstehen, besteht darin, sie als eine praktische Syntax zu betrachten, die Ihnen einige Java-Typkonvertierungsvorgänge (Casting) ersparen kann:

List<Apple> box = new ArrayList<Apple>();box.add(new Apple());Apple apple =box.get(0);

Der obige Code Es war Ganz klar ausgedrückt: Box ist eine Liste mit Apple-Objekten. Die get-Methode gibt eine Apple-Objektinstanz zurück und in diesem Prozess ist keine Typkonvertierung erforderlich. Ohne Generika muss der obige Code wie folgt geschrieben werden:

Apple apple = (Apple)box.get(0);

2. Die Peinlichkeit von Generika

Der größte Vorteil von Generika besteht darin, dass sie Programmtypsicherheit bieten und abwärtskompatibel sind Aber es gibt auch eine Peinlichkeit, das heißt, der Typ des Generikums muss bei jeder Definition angegeben werden. Es fühlt sich nicht nur etwas ausführlich an, es explizit anzugeben, das Wichtigste ist, dass viele Programmierer damit nicht vertraut sind Generika, sodass sie oft nicht die richtigen Typparameter angeben können, kann der Compiler jetzt automatisch auf generische Parametertypen schließen, was solche Situationen reduzieren und die Lesbarkeit des Codes verbessern kann.


3. Verbesserungen bei der generischen Typinferenz in Java 7

Bei der Verwendung generischer Typen in früheren Versionen müssen Sie beim Deklarieren und Zuweisen von Werten generische Typen hinzufügen. Zum Beispiel:

Map<String, String> myMap = new HashMap<String, String>();

Sie denken vielleicht: Ich habe den Parametertyp bereits beim Deklarieren der Variablen angegeben. Warum muss ich ihn beim Initialisieren des Objekts erneut angeben? Glücklicherweise wurde diese Methode in Java SE 7 verbessert. Jetzt können Sie Werte mit der folgenden Anweisung deklarieren und zuweisen:

Map<String, String> myMap = new HashMap<>(); //注意后面的"<>"

In dieser Anweisung verwendet der Compiler den generischen Typ, wenn die Variable Der Typ wird beim Instanziieren der HashMap automatisch vom generischen Typ abgeleitet. Achten Sie auch hier auf das „a8093152e673feb7aba1828c43532094“. Nur das Hinzufügen dieses „a8093152e673feb7aba1828c43532094“ bedeutet, dass es sich um eine nicht generische Typ-HashMap handelt Kompilieren Sie den Quellcode. Es wird eine Warnung ausgegeben.

Allerdings: Die Typinferenz von Java SE 7 beim Erstellen generischer Instanzen ist begrenzt: Nur wenn der parametrisierte Typ des Konstruktors explizit im Kontext deklariert wird, kann die Typinferenz verwendet werden, andernfalls funktioniert sie nicht. Beispiel: Das folgende Beispiel kann in Java 7 nicht korrekt kompiliert werden (kann aber jetzt in Java 8 kompiliert werden, da der Typ der Generika automatisch anhand der Methodenparameter abgeleitet wird):

List<String> list = new ArrayList<>();
list.add("A");// 由于addAll期望获得Collection<? extends String>类型的参数,因此下面的语句无法通过
list.addAll(new ArrayList<>());

4. Generische Typinferenz in Java 8 Es gibt zwei Hauptverbesserungen bei der

generischen Zieltypinferenz in Java8:

1. Unterstützung für die Ableitung generischer Zieltypen über den Methodenkontext
2 Zieltypen in Methodenaufruflinks werden an die letzte Methode übergeben
Schauen wir uns das Beispiel auf der offiziellen Website an:

class List<E> {
   static <Z> List<Z> nil() { ... };
   static <Z> List<Z> cons(Z head, List<Z> tail) { ... };
   E head() { ... }
}

Gemäß den Eigenschaften von JEP101, wenn wir die aufrufen Die obige Methode kann wie folgt geschrieben werden:

//通过方法赋值的目标参数来自动推断泛型的类型
List<String> l = List.nil();
//而不是显示的指定类型
//List<String> l = List.<String>nil();
//通过前面方法参数类型推断泛型的类型
List.cons(42, List.nil());
//而不是显示的指定类型
//List.cons(42, List.<Integer>nil());

5. Das Obige ist der Funktionsinhalt von JEP101. Man kann sagen, dass Java eine ruhige Sprache hat Rich-Type-System. Das Problem der Konvertierung zwischen Typen bereitet jedem Java-Programmierer Probleme. Das automatische Ableiten von Typen durch den Compiler kann das Problem einer zu komplexen Typkonvertierung etwas lindern. Obwohl es eine kleine Verbesserung ist, wird es definitiv große Auswirkungen auf unsere Programmierer haben, die jeden Tag Code schreiben. Zumindest werden sie sich glücklicher fühlen ~~ Vielleicht werden wir in Java 9 eine universelle Typvariable wie js oder etwas Dynamik bekommen Sprachen von scala^_^

Weitere Artikel zur Verbesserung der generischen Zieltyp-Inferenzmethode in Java8 finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
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