您好,直接来自 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>
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
.
关于java - Generics Java,无限通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15568460/