Inhaltsverzeichnis
Verwenden Sie Generika, um Typunterschiede abzuschirmen
1. Generische Klasse
2. Definieren Sie die generische Datenanbieterschnittstelle:
Heim Java javaLernprogramm Welche Auswirkungen hat die Typschutzfunktion von Generika in Java auf den Code?

Welche Auswirkungen hat die Typschutzfunktion von Generika in Java auf den Code?

Apr 26, 2023 pm 01:34 PM
java

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;
    }
}
Nach dem Login kopieren

2. Definieren Sie die generische Datenanbieterschnittstelle:

/** 数据提供者接口 */public interface DataProvider<T> {    /** 获取数据函数 */
    public T getData();
}
Nach dem Login kopieren

Definieren Sie eine generische flache Kopierfunktion:

/** 浅拷贝函数 */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 void printValue(GenericHolder<?> holder) {
    System.out.println(holder.getValue());
}/** 主函数 */public static void main(String[] args) {
    printValue(new GenericHolder<>(12345));
    printValue(new GenericHolder<>("abcde"));
}
Nach dem Login kopieren
In der Java-Spezifikation wird die Verwendung des generischen Platzhalters „?“ nicht empfohlen. Die obige Funktion kann geändert werden in:

/** 打印取值函数 */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 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“ 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 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 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):

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());
}
Nach dem Login kopieren

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!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

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

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

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

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

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.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

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

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

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.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

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

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

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.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

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

Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Oct 13, 2024 pm 01:32 PM

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.

See all articles