通配符如何在Java中工作

7 java generics wildcard

我正在阅读关于泛型中的通配符的java教程.在以下代码中:

void printCollection(Collection<Object> c) {
    for (Object e : c) {
        System.out.println(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是否意味着集合c将类型object作为其元素,我们无法调用c.add("apple"),因为"apple"是一个字符串,for循环object从集合中获取任何元素c

但我不明白以下代码,

void printCollection(Collection<?> c) {
    for (Object e : c) {
        System.out.println(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码使用通配符,表示"元素类型与任何内容匹配的集合".这是否意味着我们可以在任何类型的对象添加到它,比如c.add("string");, c.add(1);c.add(new apple());?并且for循环e从集合中获取任何对象c,如果c不是object类型,我们说c的元素是Integer.这段代码有效吗?这是否意味着它应该被施放?

Mic*_*rdt 5

你几乎完全倒退了.

一个Collection<Object>可以包含Object和它的子类,由于一切(包括String)是的子类Object,你可以这样的集合添加任何东西.但是,您不能对其内容做任何假设,除非它们是Object.

另一方面,A Collection<?>只包含特定未知类型(及其子类)的实例,但由于您不知道它是哪种类型,因此您不能null向此类集合添加任何内容(除外),也不能对其进行任何假设.锥形(除了它们是Object,因为一切都是).