型変数は現在の型を参照できますか?
プログラミング言語では、型変数は型制約とポリモーフィズムを表現するために不可欠です。ただし、これらの変数の使用方法には制限があります。よくある質問の 1 つは、型変数がそれが存在する正確なサブタイプを参照できるかどうかです。
次のコードを考えてみましょう:
class A { <T extends A> foo(); } class B extends A { @Override T foo(); }
ここでは、ジェネリック メソッドを使用してクラス A を定義します。 foo() は型パラメータ T を受け取ります。また、メソッド foo() をオーバーライドするサブクラス B も定義します。質問は、foo() の型パラメーター T を使用して、クラス B の正確なサブタイプ B を参照できるかということです。
答え:
残念ながら、Java では使用できません。型変数が、その変数が存在する正確なサブタイプを参照することは許可されていません。上記の例の型変数 T は、foo() の範囲内では未知の型のままです。サブタイプ B に解決できません。
Curiously Recurring Template Pattern (Self Type):
「self」タイプを持つという望ましい動作を実現するには、次のようにします。 Curiously Recurring Template (CRT) パターンとして知られるデザイン パターンを使用し、「セルフ タイプ」とも呼ばれます。このパターンには、インスタンスのランタイム型を返すためのコントラクトを強制する抽象基本クラスの定義が含まれます。派生クラスは、型パラメーターを独自の型に解決することで自己型を実装します。
Java の CRT パターンの例を次に示します。
abstract class SelfTyped<SELF extends SelfTyped<SELF>> { abstract SELF self(); } public class MyLeafClass extends SelfTyped<MyLeafClass> { @Override MyLeafClass self() { return this; } } MyLeafClass mlc = new MyLeafClass(); mlc.self(); // returns mlc
このパターンは、 self() を使用する現在の型は、誤用の可能性があり、型の安全性が損なわれる可能性があるため、注意して使用する必要があります。
以上がJava では型変数は独自のサブタイプを参照できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。