Java中使用迭代器的集合类型推断?
关于Java中的类型推断,我有以下代码片段:
ArrayList<String> projectNameList = new ArrayList<String>(3);
projectNameList.add("Joe");
projectNameList.add("Jim");
projectNameList.add("Josh");
Iterator it = names.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
当我试图打印名称时,我得到了一个编译错误,表示类型不匹配:无法从对象转换为字符串
我知道要解决这个问题,我需要做的就是显式地将对象强制转换为字符串,或者显式地声明这个迭代器返回的元素类型是String类型,如下所示:
Iterator it<String> = names.iterator();
但我认为javac编译器足够聪明,可以推断迭代器返回的类型是字符串,因为迭代器()方法是在字符串数组列表上调用的
为什么这种类型的推断不会发生
# 1 楼答案
Iterator
也是泛型类型您需要将其声明为
Iterator<String> it = names.iterator();
,以便在不强制转换的情况下将其元素引用为String
将其声明为原始类型实际上会告诉编译器,您希望引用是
Iterator<Object>
正如其他人所提到的,只要打印原始
Iterator
的元素,就不会出现编译器错误——如果引用一个不存在的projectNameList
变量,而不是names
,就会出现编译器错误