可能重复:
What is a raw type and why shouldn't we use it?
在描述中,这个问题几乎是自成一体的:
Iterator<?>和
Iteratorjava中的对象?它们都迭代对象类型,对吗?
发布于 2012-03-05 20:03:54
不是的。Iterator<?>在?(从Object派生的某种类型)上迭代,而Iterator只提供Object的,这是Java中的泛型支持。
什么是?类型?这是个很棒的问题。
在Java 5之前的糟糕日子里,您有非类型化集合和非类型化迭代器。因此,您的集合中将包含Objects,并且必须手动转换它们。例如:
List foo = new ArrayList();
foo.add("Foo!");
for(Iterator i = foo.iterator(); i.hasNext(); )
{
Object element = i.next();
System.out.println((String)element);
}注意到那个演员了吗?这是因为我们只是把Object塞进列表中,我们必须自己做所有的事情。只要一个List就没那么糟了,但是想象一下地图中包含了一个.好吧,你明白了。你正在下地狱,你可能很快就不知道你是在看一张从String到Integer的地图,还是从Integer到String的另一张地图。
在Java 5中,您可以使用泛型,所以现在可以这样说:
List<String> foo = new ArrayList();
foo.add("Foo!");
for(Iterator<String> i = foo.iterator(); i.hasNext(); )
{
String element = i.next();
System.out.println(element);
}注意到演员是没有必要的?当我们使用List<String>时,我们可以使用Iterator<String>并具有某种类型安全性。
当您开始使用更复杂的数据结构进行操作时,这是非常有益的,例如:
Map<String, Map<String, Map<String, SomeRandomObject>>> complexMap;发布于 2012-03-05 19:57:29
没有什么不同,只是编译器会对第一个编译器更满意,因为它知道您并不关心Iterator返回的内容;-)
在第二种情况下,编译器可能会发出警告,因为类型未指定,无法检查。到处都是警告意味着你没有注意到那些真正重要的东西。
发布于 2012-03-05 19:56:16
第一个意思是它迭代的对象可以是任何东西。第二个在实践中是相同的,但在理论上是,您没有泛型,所以您没有使用编译器提供的优势。
https://stackoverflow.com/questions/9573031
复制相似问题