如何在JAVA中获取泛型类的泛型类型

时间:2017-03-15 04:28:13

标签: java generics

我有一个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;
}

1 个答案:

答案 0 :(得分:0)

我认为

class B extends A<V>{}

是此处的拼写错误,V必须是实际类型,例如名称为class的{​​{1}},enuminterface必须在范围内,不得与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,因此这很少就足够了。