1

假设我有一些课程如下:

class A { }

class B<TA extends A> { }

class C<TB extends B<? extends A>> {
    TA varOfTypeTA; // this throws an error obviously
}

我如何将类型定义为varOfTypeTATB 的 TA 是什么?

我知道我可以将它定义为A varOfTypeTA,但我希望它是TAnot类型A

我尝试强制它定义 TAclass C<TB extends B<TA extends A>>以便我可以使用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

4

2 回答 2

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;
}
于 2015-03-25T11:55:45.870 回答
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; }
}
于 2015-03-25T11:57:26.380 回答