Generische Java Enum-Typparameter
Die Syntax
class Enum<E erweitert Enum<E>></pre> ; mag im Zusammenhang mit Java-Generika zunächst verwirrend erscheinen. Dieser Typparameter erfüllt jedoch einen bestimmten Zweck innerhalb der Enum-Klasse.</p><p><strong>Selbstreferenzielles Typargument</strong></p><p>Das Typargument E repräsentiert die Aufzählung selbst. Durch die Ableitung des Typarguments aus einer Aufzählung deklariert die Definition effektiv, dass die Aufzählung sich selbst als ihr Typargument bezeichnen muss.</p><p>Betrachten Sie beispielsweise die folgende Aufzählung:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">public class StatusCode extends Enum<StatusCode> { // ...enum constants... }</p> <p>Hier In diesem Fall entspricht E dem StatusCode. Dieses selbstreferenzielle Typargument hat die folgenden Vorteile:</p> <ul> <li> <strong>Selbstreferenzierende API:</strong> Ermöglicht der Enum-Klasse, in ihrer API auf ihren eigenen Typ zu verweisen, z. B. durch die Deklaration, dass Enum< ;E> implementiert Comparable<E>.</li> <li> <strong>Typsicherheit:</strong> Stellt sicher, dass Aufzählungen nur mit anderen Aufzählungen desselben Typs verglichen werden können, wodurch ungültige Vergleiche zwischen verschiedenen Aufzählungstypen verhindert werden.</li> </ul> <p><strong>Anwendungen jenseits von Enum</strong></p> <p>Während dies Der Typ eines selbstreferenziellen Typparameters wird hauptsächlich in der Enum-Klasse verwendet. Er kann jedoch auch in anderen Kontexten verwendet werden, in denen es erforderlich ist, einen Typ zu definieren, der rekursiv auf sich selbst verweist.</p> <p>Ein Beispiel ist der Message and Builder Schnittstellen, die in ProtocolBuffers verwendet werden. Diese Schnittstellen sind für die paarweise Verwendung konzipiert, wobei eine Nachricht unveränderlich und ein Builder veränderbar ist. Die folgenden Schnittstellen veranschaulichen die Verwendung selbstreferenzieller Typargumente:</p> <pre class="brush:php;toolbar:false">public interface IBuilder<TMessage, TBuilder> where TMessage : IMessage<TMessage, TBuilder> where TBuilder : IBuilder<TMessage, TBuilder> public interface IMessage<TMessage, TBuilder> where TMessage : IMessage<TMessage, TBuilder> where TBuilder : IBuilder<TMessage, TBuilder>
Diese Schnittstellen stellen sicher, dass eine Nachricht nur von ihrem entsprechenden Builder erstellt werden kann und ein Builder nur seine entsprechende Nachricht erstellen kann.
Einschränkungen
Diese Art von selbstreferenziellem Typparameter bietet zwar Vorteile, tut dies aber auch verhindert die Erstellung ungültiger Typen nicht vollständig. Beispielsweise würden die folgenden Typen kompiliert, aber zu ungültigen Vergleichen führen:
public class First extends Enum<First> {} public class Second extends Enum<First> {}
In diesem Fall würde Second Comparable
Das obige ist der detaillierte Inhalt vonWie funktioniert der generische Enum-Typparameter von Java und welche Einschränkungen hat er?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!