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
– 除非a
为null
。
之前已经回答过: Java Generics – 什么是无限的通配符? 例如, 未绑定的通配符和原始类型之间的区别 。
所以,是的, >
和原始类型是相同的(在运行时)。