说我有一些课程如下:
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
类型?
答案 0 :(得分:6)
同时在同一个班级中声明TA
为通用。
public class C<TA extends A, TB extends B<TA>> {
TA varOfTypeTA;
}
然后您可以在班上使用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;
}
答案 1 :(得分:1)
您必须传递两种泛型类型。所以,例如:
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; }
}