如何在 class 中使用扩展泛型类型?
How do I use an extended generic type's type in a class?
假设我有一些 类 如下:
class A { }
class B<TA extends A> { }
class C<TB extends B<? extends A>> {
TA varOfTypeTA; // this throws an error obviously
}
如何定义 varOfTypeTA
的类型为 TB 的 TA 是什么?
我知道我可以将其定义为 A varOfTypeTA
,但我希望它的类型为 TA
而不是 A
。
我试图强制它用 class C<TB extends B<TA extends A>>
定义 TA,这样我就可以使用 TA
,但这会引发语法错误。
澄清一下,如果我再定义这些 类:
class Horse extends A { }
class HorseHerd extends B<Horse> { }
class HorseHerder extends C<HorseHerd> {
Horse getFavoriteHorse() { return varOfTypeTA; } // varOfTypeTA defined in class C must be of type Horse, otherwise I have to cast
}
如何使 varOfTypeTA
成为 Horse
类型?
同时将 TA
声明为同一个 class 中的泛型。
public class C<TA extends A, TB extends B<TA>> {
TA varOfTypeTA;
}
然后您可以在 class 中使用 TA
。
class HorseHerder extends C<Horse, HorseHerd> {
Horse getFavoriteHorse() { return this.varOfTypeTA; }
}
我也很惊讶地发现声明的顺序在这里似乎并不重要。虽然我更愿意先声明 TA
,但我发现这段代码也可以编译:
public class C<TB extends B<TA>, TA extends A> {
TA varOfTypeTA;
}
您必须通过两种通用类型。所以,例如:
class C<TB extends B<TA>, TA extends A> {
TA varOfTypeTA;
}
class Horse extends A {}
class HorseHerd extends B<Horse> {}
class HorseHerder extends C<HorseHerd, Horse> {
Horse getFavoriteHorse() { return varOfTypeTA; }
}
假设我有一些 类 如下:
class A { }
class B<TA extends A> { }
class C<TB extends B<? extends A>> {
TA varOfTypeTA; // this throws an error obviously
}
如何定义 varOfTypeTA
的类型为 TB 的 TA 是什么?
我知道我可以将其定义为 A varOfTypeTA
,但我希望它的类型为 TA
而不是 A
。
我试图强制它用 class C<TB extends B<TA extends A>>
定义 TA,这样我就可以使用 TA
,但这会引发语法错误。
澄清一下,如果我再定义这些 类:
class Horse extends A { }
class HorseHerd extends B<Horse> { }
class HorseHerder extends C<HorseHerd> {
Horse getFavoriteHorse() { return varOfTypeTA; } // varOfTypeTA defined in class C must be of type Horse, otherwise I have to cast
}
如何使 varOfTypeTA
成为 Horse
类型?
同时将 TA
声明为同一个 class 中的泛型。
public class C<TA extends A, TB extends B<TA>> {
TA varOfTypeTA;
}
然后您可以在 class 中使用 TA
。
class HorseHerder extends C<Horse, HorseHerd> {
Horse getFavoriteHorse() { return this.varOfTypeTA; }
}
我也很惊讶地发现声明的顺序在这里似乎并不重要。虽然我更愿意先声明 TA
,但我发现这段代码也可以编译:
public class C<TB extends B<TA>, TA extends A> {
TA varOfTypeTA;
}
您必须通过两种通用类型。所以,例如:
class C<TB extends B<TA>, TA extends A> {
TA varOfTypeTA;
}
class Horse extends A {}
class HorseHerd extends B<Horse> {}
class HorseHerder extends C<HorseHerd, Horse> {
Horse getFavoriteHorse() { return varOfTypeTA; }
}