我有一个A级
class A<V>{}
和B类延伸A
class B extends A<V>{}
和C类有通用B,我想知道B中的V
可以这样做
class C<P extends B<V>,V>{
P mP;
V mV;
}
但是由于P的泛型类型(即B类)知道它必须有一个V(即A类),所以在创建C的对象时,我不必指定V来知道V是什么。 我试过像这样的代码,但这是无效的
class C<P<V> extends B>{
P mP;
V mV;
}
答案 0 :(得分:0)
我认为
class B extends A<V>{}
是此处的拼写错误,V
必须是实际类型,例如名称为class
的{{1}},enum
或interface
必须在范围内,不得与V
的类型参数{{1由于A
不是通用的,V
不应该编译。
所以我假设
B
在该设置中,
P extends B<V>
将是一个有效的声明,引入一个新的类型参数class B<V> extends A<V>{}
并定义与class C<P extends B<V>,V>{
P mP;
V mV;
}
的关系。在这种情况下,您无法省略V
。如果您未在B
中使用V
,则可以使用V
表示您不关心C
的实际类型参数。
但是由于您使用class C<P extends B<?>>
,因此必须声明它。这可能会让B
的用户感到恼火,因为V
希望C
用于V
所使用的实际类型,但在Java中无法解决这个问题。
您可以获得的最接近的是将类分离为具有单个类型参数的前端类和专用实现类,可以在使用“菱形运算符”时实例化而无需指定类型参数,即< / p>
P
但不幸的是,这意味着abstract class FrontEnd<T> {
// define the API
}
class C<P extends B<V>, V> extends FrontEnd<P> {
P mP;
V mV;
}
…
FrontEnd<ActualSubtypeOfB> myObj = new C<>();
的API无法引用FrontEnd
,因此这很少就足够了。