如何在类中使用扩展泛型类型?

时间:2015-03-25 11:52:28

标签: java generics nested-generics

说我有一些课程如下:

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类型?

2 个答案:

答案 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; }
}