泛型Java,无界通配符

时间:2013-03-22 10:49:37

标签: java generics unbounded-wildcard

您好直接来自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替换。知道编译时使用无界外卡编译器会做什么?只是删除它,因为它是原始类型?

提前致谢。

2 个答案:

答案 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 - 除非anull

答案 1 :(得分:-1)

之前已经回答过:例如Java Generics - What's really in a unbounded wildcard?Difference between an unbound wildcard and a raw type

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