如何在类中使用扩展泛型类型?
说我有一些类如下:如何在类中使用扩展泛型类型?
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
作为同一类中的通用名。
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;
}
您必须同时传递两个泛型类型。因此,例如:
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; }
}
宁愿埃里克罗伯逊的方法。在声明之前使用某些东西总是令人困惑。在这里你使用** TA **类型,并在使用后声明它:) – Vyncent 2015-03-25 12:03:48
@Vyncent同意。我会在这里留下这个答案,以表明它可以通过其他方式完成。 – blalasaadri 2015-03-25 12:08:59
没有概率,你的回答是正确的,我只是告诉我更喜欢哪种方法;) – Vyncent 2015-03-25 12:11:06
我担心这将是唯一的答案。没有每次都将其作为单独类型添加的方式来声明它的方法? – manixrock 2015-03-25 12:23:50
我可以看到你只需要一个的唯一方法就是如果你可以删除'TB'。如果你可以创建一个类'Herd',你可以为每个'TA'使用,那么你可以声明'public class C ',在里面使用'Herd '而不是'TB' 'C',然后声明'public class HorseHerder extends C '来扩展它。 –
2015-03-25 15:51:04
如果您需要使用'TA'来设置'C',那么您需要声明'TA'。 – 2015-03-25 15:52:07