3

您好,直接来自 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 替换。意识到在编译时使用无界通配符编译器会做什么?只是将其删除,因为它是原始类型?

提前致谢。

4

2 回答 2

3

假设我们有一个泛型声明

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>,它的原始版本包含与 pre-java5接口List完全相同的方法签名。List原始类型用于向后兼容。

RawList非常接近List<Object>; 但与List<?>


类型的对象fooFoo<?>类型为

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

对于一些确定的,尽管未知的类型 X。虽然 X 是未知的,但我们仍然可以调用foo.get()and foo.bet()。但是我们不能调用foo.set(a),因为没有办法知道 is 是否a属于未知类型X- 除非ais null

于 2013-03-22T16:27:09.630 回答
-1

之前已经回答过这个问题:Java 泛型 - 无界通配符中的真正内容是什么?例如,未绑定通配符和原始类型之间的差异

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

于 2013-03-22T11:11:57.410 回答