2010-07-07 98 views
2

通用泛型参数泛型类与泛型参数和泛型参数之间有什么区别?Java通用参数之间的区别

实施例:

简单通用类:

public class Foo<T> { /*...*/ } 

简单的类,延伸简单通用类的通用参数设置为一些无关紧要的类型:另一种通用类

public class FooFoo extends Foo<Type1> { /*...*/ } 

public class Bar<T> extends FooFoo { /*...*/ } 

我们的基类,作为泛型参数需要的东西,扩展类Foo

public class TestFooClass<T extends Foo<?>> { /*...*/ } 

而问题是什么

public class BarTestOne extends TestFooClass<Bar> { /*...*/ } 

public class BarTestTwo extends TestFooClass<Bar<?>> { /*...*/ } 

问题

Class<T> class = (Class<T>) ((Foo)getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 

在这两个参数之间的尊重第一个案例代码在第二个案件中不起作用。

+1

另请参阅http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it – polygenelubricants 2010-07-07 17:23:08

回答

3

它看起来像你试图确定TestFooClass参数化的实际类型?

在这方面,使用通用类具有和不具有其通用的参数之间的不同之处在于getActualTypeArguments()[0]将:

  1. 在第一种情况提供类的代表原始类型
  2. 一个实例
  3. 在第二种情况下,提供一个ParameterizedType的实例(因此可能会得到ClassCastException)。如果您在该ParameterizedType上调用getRawType(),您将获得代表原始类型的Class。

此:

BarTestOne one = new BarTestOne(); 
BarTestTwo two = new BarTestTwo(); 

Class<?> clazz1 = (Class<?>) ((ParameterizedType) one.getClass().getGenericSuperclass()).getActualTypeArguments()[0];  
Class<?> clazz2 = (Class<?>) ((ParameterizedType) ((ParameterizedType) two.getClass().getGenericSuperclass()).getActualTypeArguments()[0]).getRawType(); 

System.out.println(clazz1.equals(clazz2)); 

这将返回真正

唉,任何更深的答案都超出了我对泛型的认识。

0

Bar意味着Bar<Object>Bar<?>没有。例如,如果你有一个List,你可以添加它,如果你有一个List<?>你不能,因为编译器不知道你的对象是否与对象的“实际泛型类型”兼容。

至于反射码,我不知道。它说getClass(),这取决于你打电话给它的对象;在这种情况下,对象显然是this ...这个代码从哪里调用?

+0

是的,但在这种情况下,酒吧或酒吧具有相同的影响。 – 2010-07-07 15:28:54

+0

实际上Bar是原始超类型Bar 和Bar 是Bar 的子类型。 – 2010-07-07 20:43:29

相关问题