Oracle 的 Collection<Object> 教程令人困惑

gri*_*sty 5 java generics collections object

我正在学习 Java 泛型并阅读泛型方法

此页面开头为

考虑编写一个方法,该方法接受一个对象数组和一个集合,并将数组中的所有对象放入集合中

然后它指出

到现在为止,您将学会避免初学者尝试使用Collection<Object>集合参数的类型的错误。

该页面推断使用Collection<Object>将不起作用。

为什么这是一个错误?为什么这是初学者的错误?

Collection<Object>因为该参数对我来说效果很好。我是不是太初学者了,以至于我以某种方式编写了可以工作的代码,但却错过了练习的重点?

import java.util.ArrayList;
import java.util.Collection;

public class test {

    static void fromArrayToCol(Object a[],Collection<Object> c)
    {
     for (Object x:a){c.add(x);}
     System.out.println(c);
    }

    public static void main(String[] args) {
        test r=new test();
        Object[] oa=new Object[]{"hello",678};
        Collection<Object> c=new ArrayList<>();

        test.fromArrayToCol(oa,c);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我看来,Oracle 的教程的断言是错误的。但我是初学者,所以很可能我没有理解它想告诉我的内容。

use*_*er7 2

如果您阅读通配符部分,您可以找到答案。

问题是这个新版本的用处远不如旧版本。虽然旧代码可以使用任何类型的集合作为参数来调用,但新代码只接受 Collection,正如我们刚刚演示的那样,它不是所有类型集合的超类型!

这里,旧版本指的是参数Collection,新代码指的是Collection<Object>

当您有类型参数时,Collection<Object>您可以传递Collection(原始类型)或Collection<Object>. 您不能传递任何其他集合,例如Collection<String>Collection<SomeClass>

因此,该教程的目标是将包含任何类型的数组的元素复制到相同类型的新集合中。 示例: Integer[]Collection<Integer>

我想说的是,它的措辞不恰当,无法表达上述含义。