Java Enum ジェネリック型パラメータ
構文
class Enum<E extends Enum<E>></pre> ; Java ジェネリックスのコンテキストでは、最初は混乱するように思えるかもしれません。ただし、この型パラメータは Enum クラス内で特定の目的を果たします。</p><p><strong>自己参照型引数</strong></p><p>型引数 E は列挙型自体を表します。列挙型から型引数を導出することにより、定義は、列挙型が型引数としてそれ自体を参照する必要があることを効果的に宣言します。</p><p>たとえば、次の列挙型を考えてみましょう。</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>この例では、この場合、E は StatusCode に相当します。この自己参照型引数には次の利点があります。</p> <ul> <li> <strong>自己参照 API:</strong> Enum クラスが API 内で独自の型を参照できるようにします (Enum< の宣言など)。 ;E> Comparable<E> を実装します。</li> <li> <strong>タイプ セーフティ:</strong> 列挙型が同じ型の他の列挙型とのみ比較できるようにし、異なる列挙型間の無効な比較を防ぎます。</li> </ul> <p><strong>その先のアプリケーションEnum</strong></p> <p>このタイプの自己参照型パラメーターは主に Enum クラスで使用されますが、それ自体を再帰的に参照する型を定義する必要がある他のコンテキストでも使用できます。</p> <p>一例は、ProtocolBuffers で使用される Message インターフェイスと Builder インターフェイスです。これらのインターフェイスは、メッセージが不変でビルダーが変更可能なペアで使用するように設計されています。次のインターフェイスは、自己参照型引数の使用を示しています。</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>
これらのインターフェイスにより、メッセージは対応するビルダーによってのみ構築され、ビルダーは対応するメッセージのみを構築できることが保証されます。
制限事項
このタイプの自己参照型パラメーターには利点がありますが、無効な型の作成を完全に防ぐことはできません。たとえば、次の型はコンパイルされますが、無効な比較が行われます。
public class First extends Enum<First> {} public class Second extends Enum<First> {}
この場合、Second は Comparable
以上がJava の Enum ジェネリック型パラメータ ` はどのように機能し、その制限は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。