我正在学习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);
}
}在我看来,Oracle的教程的断言是错误的。但我是个初学者,所以很可能我没有领会它想要告诉我什么。
发布于 2018-06-13 16:10:51
如果您阅读通配符部分,您可以找到答案。
问题是这个新版本比旧版本要有用得多。虽然旧代码可以以任何类型的集合作为参数来调用,但是新代码只使用Collection,正如我们刚才所演示的,它是而不是,它是各种集合的超级类型!
在这里,旧版本引用参数Collection,而新代码引用Collection<Object>
当您有一个Collection<Object>类型的参数时,可以传递一个Collection (原始类型)或一个Collection<Object>。您不能传递任何其他集合,如Collection<String>或Collection<SomeClass>。
因此,该教程的目标是将包含任何类型的数组的元素复制到同一类型的新集合中。示例:Integer[]到Collection<Integer>
我要说的是,这句话的措辞不恰当,不足以表达上述意思。
发布于 2018-06-13 16:14:58
这通常是一个错误,不是因为它是一个编译器错误,而是因为拥有一个Collection<Object>很少有用。这样的收藏品可以保存任何东西。你多久需要一个能保存任何东西的收藏品?很少有。几乎总是有一个更具体的类型参数可以用于您的集合。
经常使用Collection<Object>不仅会使程序员的生活变得比需要的更艰难。要从中获取任何内容,我们需要检查它的类型(例如,使用instanceof)并对其进行转换。
通过使用最合适的类型参数,您可以让自己在编译时保证集合只包含您期望的对象类型,并且得到的代码更加简洁和可读性更强。
发布于 2018-06-13 16:19:45
来澄清。如果在编译时不知道集合的类型,则不能在其中放置元素。
在当前的示例中,您确实知道希望放入集合中的对象的类型(在您的示例中,它是一个对象)。在您喜欢的站点上显示的示例是
static void fromArrayToCollection(Object[] a, Collection<?> c) {
for (Object o : a) {
c.add(o); // compile-time error
}
}注意,这里有一个?,而不是一个Object。因此,您将得到一个编译时错误。
在使用Object进行编译的问题中,您展示了一个示例;但是,有更好的方法来解决这个问题。
最大的问题是,它只适用于扩展具有泛型对象类型的集合的类型。这使得它具有很强的限制性。该页面告诉您,只要集合和数组保持相同的类型,就有一种方法可以工作。
https://stackoverflow.com/questions/50841468
复制相似问题