通配符在Java中的工作方式

用户707549:

我正在阅读有关泛型中通配符的Java教程。在下面的代码中:

void printCollection(Collection<Object> c) {
    for (Object e : c) {
        System.out.println(e);
    }
}

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

但是我不明白下面的代码,

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

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

迈克尔·伯格沃特(Michael Borgwardt):

您几乎完全倒退了。

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

另一方面,A Collection<?>仅包含特定未知类型(及其子类)的实例,但是由于您不知道它是哪种类型,因此您无法null在此类集合中添加任何内容(除外),也不能对其进行任何假设内容(除了它们是Objects,因为所有内容都是)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章