パラメータ化された typeA<T extends B>
と別のがありC<T2 extends A>
ます。
の 2 番目の型パラメーターとして追加することなくT
、内部からサブクラスを (静的に) 参照することは可能ですか? 目的は、戻り値の型を持つメソッドを追加することです。C
T
C
C
T
書きたいこと:
class A<T extends B> {
}
class C<T2 extends A<T>> {
T myMethod() {
}
}
パラメータ化された typeA<T extends B>
と別のがありC<T2 extends A>
ます。
の 2 番目の型パラメーターとして追加することなくT
、内部からサブクラスを (静的に) 参照することは可能ですか? 目的は、戻り値の型を持つメソッドを追加することです。C
T
C
C
T
書きたいこと:
class A<T extends B> {
}
class C<T2 extends A<T>> {
T myMethod() {
}
}
答えはイエスだと思います。間接的にはできます。
型消去のため、直接行うことはできないと思います。他の人が述べたように、別のパラメーター、型パラメーター、またはネストされたクラスを追加する必要があります。
ジェネリック関数、クラスの呼び出し元からのヘルプ、および基本クラスからのヘルプの組み合わせを使用して間接的に行うことができます。
class B
{
}
class B2 extends B // B2 is Just an example of a concrete type T
{
}
class A<T extends B> {
T t;
T getT()
{
return t;
}
}
class C<T2 extends A<?>> {
T2 t2;
T2 getT2()
{
return t2;
}
<X> X getValWithInnerType(A<? extends X> x)
{
return x.getT();
}
}
public class Example {
public static void main(String[] args) {
C<A<B2>> c1 = new C<>();
B2 inner = c1.getValWithInnerType(c1.getT2());
}
}
必要な型を取得したいが、必ずしも C クラスから直接取得する必要がない場合は、コンポジションを使用してより簡単なことを行うこともできます。
class B
{
}
class B2 extends B
{
}
class A<T extends B> {
T t;
T getT()
{
return t;
}
}
class C<T2 extends A<?>> {
T2 t2;
T2 getT2()
{
return t2;
}
}
public class Example {
public static void main(String[] args) {
C<A<B2>> c1 = new C<>();
B2 inner = c1.getT2().getT();
}
}
最後に、正確な派生型 T を取得することがそれほど重要でない場合は、型 B を返す関数を使用できます。
class B
{
}
class B2 extends B
{
}
class A<T extends B> {
T t;
T getT()
{
return t;
}
}
class C<T2 extends A<? extends B>> {
T2 t2;
B getT2()
{
return t2.getT();
}
}