


Welche Auswirkungen hat die Typschutzfunktion von Generika in Java auf den Code?
Verwenden Sie Generika, um Typunterschiede abzuschirmen
In der C++-Sprache gibt es eine sehr nützliche Vorlagenfunktion, die eine allgemeine Version mit parametrisierten Typen schreiben kann, sodass der Compiler automatisch spezifische Versionen für verschiedene Typen generieren kann. In der Java-Sprache gibt es eine ähnliche Funktion namens Generics. Beim Schreiben von Klassen und Methoden werden im Allgemeinen bestimmte Typen verwendet, und Generika können zum Parametrisieren von Typen verwendet werden, sodass allgemeinerer Code geschrieben werden kann.
Viele Leute glauben, dass die Konzepte von C++-Vorlagen und Java-Generika gleichwertig sind, aber tatsächlich sind die Implementierungsmechanismen völlig unterschiedlich. C++-Vorlagen sind eine Reihe von Makroanweisungen, und der Compiler erstellt eine Kopie des Vorlagencodes für jeden Typ. Die Implementierung von Java-Generika basiert auf dem Konzept der „Typlöschung“, bei dem es sich im Wesentlichen um einen syntaktischen Zucker für Typbeschränkungen handelt.
1. Generische Klasse
Nehmen Sie die unterstützende Klasse des Generikums:
/** 通用支撑类 */@Getter@Setter@ToStringpublic class GenericHolder<T> { /** 通用取值 */ private T value; /** 构造函数 */ public GenericHolder() {} /** 构造函数 */ public GenericHolder(T value) { this.value = value; } }
2. Definieren Sie die generische Datenanbieterschnittstelle:
/** 数据提供者接口 */public interface DataProvider<T> { /** 获取数据函数 */ public T getData(); }
/** 浅拷贝函数 */public static <T> T shallowCopy(Object source, Class<T> clazz) throws BeansException { // 判断源对象
if (Objects.isNull(source)) { return null;
} // 新建目标对象
T target; try {
target = clazz.newInstance();
} catch (Exception e) { throw new BeansException("新建类实例异常", e);
} // 拷贝对象属性
BeanUtils.copyProperties(source, target); // 返回目标对象
return target;
}
Nach dem Login kopieren
Generische Platzhalter verwenden im Allgemeinen „?“ anstelle von tatsächlichen Parametern eines bestimmten Typs. Wenn der spezifische Typ unsicher ist, können Sie den generischen Platzhalter „?“ verwenden. Wenn Sie die spezifischen Funktionen des Typs nicht verwenden müssen und nur die Funktionen in der Object-Klasse verwenden, können Sie den generischen Platzhalter „?“ verwenden.
/** 浅拷贝函数 */public static <T> T shallowCopy(Object source, Class<T> clazz) throws BeansException { // 判断源对象 if (Objects.isNull(source)) { return null; } // 新建目标对象 T target; try { target = clazz.newInstance(); } catch (Exception e) { throw new BeansException("新建类实例异常", e); } // 拷贝对象属性 BeanUtils.copyProperties(source, target); // 返回目标对象 return target; }
/** 打印取值函数 */public static void printValue(GenericHolder<?> holder) { System.out.println(holder.getValue()); }/** 主函数 */public static void main(String[] args) { printValue(new GenericHolder<>(12345)); printValue(new GenericHolder<>("abcde")); }
/** 打印取值函数 */public static <T> void printValue(GenericHolder<T> holder) {
System.out.println(holder.getValue());
}
Nach dem Login kopieren
5. Bei Verwendung von Generika können wir auch die festlegen Eingehende generische Typ-Aktualparameter unterliegen Ober- und Untergrenzen. Beispielsweise dürfen Typ-Aktualparameter nur in einem bestimmten Typ einer übergeordneten Klasse oder einem bestimmten Typ einer Unterklasse übergeben werden. Die Deklaration der oberen und unteren Grenzen eines generischen Typs muss zusammen mit der Deklaration des generischen Typs erfolgen. Platzhalter für obere Grenze (erweitert): Der Platzhalter für obere Grenze ist „erweitert“, der seinen angegebenen Typ oder seine Unterklasse als allgemeinen Parameter akzeptieren kann. Es gibt auch eine spezielle Form, die angibt, dass es sich nicht nur um eine Unterklasse des angegebenen Typs handeln muss, sondern auch bestimmte Schnittstellen implementieren muss. Beispiel: List erweitert A> gibt an, dass es sich um eine Liste einer bestimmten Unterklasse von A handelt und das gespeicherte Objekt A oder eine Unterklasse von A sein muss. Für die Liste „Liste erweitert A>“ können Sie kein A oder ein Unterklassenobjekt von A hinzufügen, sondern nur das Objekt von A abrufen. Platzhalter für untere Grenze (super): Der Platzhalter für untere Grenze ist „super“, der seinen angegebenen Typ oder seine übergeordnete Klasse als allgemeinen Parameter akzeptieren kann. Beispiel: List super A> gibt an, dass es sich um eine Liste einer bestimmten übergeordneten Klasse von A handelt und das gespeicherte Objekt A oder eine Oberklasse von A sein muss. Für List super A> können Sie A oder ein Unterklassenobjekt von A hinzufügen, aber Sie können nur das Objekt von Object abrufen. PECS-Prinzip (Producer Extends Consumer Super): /** 打印取值函数 */public static <T> void printValue(GenericHolder<T> holder) { System.out.println(holder.getValue()); }
Beim Bereitstellen von Daten als Produzent (Auslesen) ist es sinnvoll, Obergrenzen-Wildcards zu verwenden (erweitert);
Beim Konsumieren von Daten als Konsument (Einschreiben) ist es sinnvoll um untere Grenzen zu verwenden Wildcard (super). Bei der täglichen Codierung wird häufiger der Platzhalter für die Obergrenze (erweitert) verwendet, der zum Begrenzen der übergeordneten Klasse eines generischen Typs verwendet wird. Der Beispielcode lautet wie folgt:/** 数字支撑类 */@Getter@Setter@ToStringpublic class NumberHolder<T extends Number> { /** 通用取值 */ private T value; /** 构造函数 */ public NumberHolder() {} /** 构造函数 */ public NumberHolder(T value) { this.value = value; } }/** 打印取值函数 */public static <T extends Number> void printValue(GenericHolder<T> holder) { System.out.println(holder.getValue()); }
Das obige ist der detaillierte Inhalt vonWelche Auswirkungen hat die Typschutzfunktion von Generika in Java auf den Code?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.
