ジェネリック型を継承し、型を受け取った子クラスに強制することは可能ですか?
何かのようなもの:
class A<GenericType>{}
class B extends A<GenericType>{}
または:
class B <PreciseType> extends A <GenericType>{}
しかし、B で使用される GenericType はどこで定義すればよいのでしょうか?
ジェネリック型を継承し、型を受け取った子クラスに強制することは可能ですか?
何かのようなもの:
class A<GenericType>{}
class B extends A<GenericType>{}
または:
class B <PreciseType> extends A <GenericType>{}
しかし、B で使用される GenericType はどこで定義すればよいのでしょうか?
与えられた
class A<T> {}
何をしようとしているかによって異なりますが、両方のオプションが可能です。
class B extends A<SomeType> {};
B bar = new B();
A<SomeType> foo = bar; //this is ok
と
class B<T> extends A<T>{}; //you could use a name different than T here if you want
B<SomeType> bar = new B<SomeType>();
A<SomeType> foo = bar; //this is ok too
ただし、最初のケースではSomeTypeは実際のクラス ( などString
) であり、2 番目のケースではTはジェネリック型引数であり、型 B のオブジェクトを宣言/作成するときにインスタンス化する必要があることに注意してください。
アドバイスとして、コレクションでジェネリックを使用するのは簡単で簡単ですが、独自のジェネリック クラスを作成する場合は、それらを正しく理解する必要があります。それらの分散特性についていくつかの重要な問題があるため、チュートリアルを注意深く何度も読み、それらを習得してください。
A が として宣言されていて、たとえばのみにclass A<T> {}
特化したいと仮定すると、それを として宣言できます。String
class B extends A<String>
例:
public class A<T> {
public T get() {
return someT;
}
}
public class B extends A<String> {
public String get() {
return "abcd";
}
}
class B extends A<GenericType>{}
これは可能です。あなたのクラスは、特定のクラスをパラメーターとして持つB
ジェネリック クラスを拡張した新しいクラスになり、ジェネリック クラスにはなりません。A
B
class B <PreciseType> extends A <GenericType>{}
この場合、B
ジェネリック パラメータを持つジェネリック クラスを作成しますPreciseType
。このクラスB
は の特定のバージョンを拡張しますA
が、A
のパラメータは に依存しませんPreciseType
。
親クラスの指定で使用されるパラメーターを持つジェネリック クラスを作成する場合は、次を使用できます。
class B <PreciseType> extends A <PreciseType>{}