有人可以向我解释为什么Java忽略除String
类之外的所有对象类型上的迭代器的强制转换?
我有以下代码:
List list = new LinkedList();
list.add(new Object());
list.add(new String("First"));
list.add(10);
list.add(2.3);
我有两个案例:
1)
Iterator<Integer> crunchifyIterator = list.iterator();
while (crunchifyIterator.hasNext()) {
System.out.println((crunchifyIterator.next()));
}
结果是:
java.lang.Object@2a139a55
首先
10个
2.3
2)
Iterator<String> crunchifyIterator = list.iterator();
while (crunchifyIterator.hasNext()) {
System.out.println((crunchifyIterator.next()));
}
结果是:
线程中的异常&#34; main&#34; java.lang.ClassCastException: java.lang.Object无法强制转换为java.lang.String
我不知道原因是什么。
答案 0 :(得分:6)
System.out.println()
您要将不同类型的Objects
添加到列表
List list = new LinkedList();
list.add(new Object()); // Type Object
list.add(new String("First")); // Type String
list.add(10); // Type Integer (not int)
list.add(2.3); // Type Float (not float)
在第一个循环中,它调用
System.out.println(Object o); // String, Interger, Float are all objects this causes no issues
在第二个循环中调用
System.out.println(String str); // This is where the casting fails, Object, Integer, and Float are not Strings.
原因是运算符重载调用的版本是在编译时确定的(不是运行时)。
注意:强>
实际上,除了List的泛型类型之外,不应该在迭代器上使用泛型类型。在您的情况下,类型默认为对象。