genericsJava,无界的通配符

您好直接来自Oracle提供的Java教程http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html

static void filter(Collection c) { for (Iterator it = c.iterator(); it.hasNext(); ) if (!cond(it.next())) it.remove(); } 

我知道编译时的类型擦除。 而且我也知道一个类型(无界)将被Object替换。 知道在编译时使用无界外卡编译器会做什么? 只是删除它,因为它是原始类型?

提前致谢。

假设我们有一个通用声明

 interface Foo T get(); void set(T); void bet(); 

原始类型Foo等同于声明为的类型

 interface Foo Object get(); void set(Object); void bet(); // all generics info are stripped 

例如,在Java 5中我们有List ,它的原始版本List包含与pre-java5 List接口完全相同的方法签名。 原始类型用于向后兼容。

Raw List非常接近List ; 但与List非常不同


Foo类型的对象foo的类型为

 interface Foo X get(); void set(X); void bet(); 

对于某些确定的,虽然未知,但是类型为X.虽然X未知,但我们仍然可以调用foo.get()foo.bet() 。 但是我们不能调用foo.set(a)因为没有办法知道a是否是未知类型X – 除非anull

之前已经回答过: Java Generics – 什么是无限的通配符? 例如, 未绑定的通配符和原始类型之间的区别 。

所以,是的, 和原始类型是相同的(在运行时)。