您好直接来自Oracle http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html
提供的Java教程static void filter(Collection<?> c) {
for (Iterator<?> it = c.iterator(); it.hasNext(); )
if (!cond(it.next()))
it.remove();
}
我知道编译时的类型擦除。而且我也知道一个类型(无界)将被Object替换。知道编译时使用无界外卡编译器会做什么?只是删除它,因为它是原始类型?
提前致谢。
答案 0 :(得分:2)
假设我们有一个通用声明
interface Foo<T>
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<E>
,其原始版本List
包含与pre-java5 List
接口完全相同的方法签名。原始类型用于向后兼容。
原始List
非常接近List<Object>
;但与List<?>
foo
类型的对象Foo<?>
的类型为
interface Foo<X>
X get();
void set(X);
void bet();
对于某些确定的,尽管未知的类型X.虽然X未知,但我们仍然可以调用foo.get()
和foo.bet()
。但我们无法调用foo.set(a)
,因为无法知道a
是否属于未知类型X
- 除非a
为null
。
答案 1 :(得分:-1)
之前已经回答过:例如Java Generics - What's really in a unbounded wildcard?和Difference between an unbound wildcard and a raw type。
所以,是的,<?>
和原始类型是相同的(在运行时)。