Java:在Iterator上强制转换忽略除String类型之外的整数

Abe*_*elo 1 java string integer iterator classcastexception

有人可以向我解释为什么Java忽略除了String类之外的所有对象类型的迭代器的强制转换?

我有以下代码:

List list = new LinkedList();
list.add(new Object());
list.add(new String("First"));
list.add(10);
list.add(2.3);
Run Code Online (Sandbox Code Playgroud)

我有两个案例:

1)

Iterator<Integer> crunchifyIterator = list.iterator();
while (crunchifyIterator.hasNext()) {
    System.out.println((crunchifyIterator.next()));
}
Run Code Online (Sandbox Code Playgroud)

结果是:

java.lang.Object@2a139a55

10个
2.3

2)

Iterator<String> crunchifyIterator = list.iterator();
while (crunchifyIterator.hasNext()) {
    System.out.println((crunchifyIterator.next()));
}
Run Code Online (Sandbox Code Playgroud)

结果是:

线程"main"中的异常java.lang.ClassCastException:java.lang.Object无法强制转换为java.lang.String

我不知道原因是什么.

cyr*_*xis 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)
Run Code Online (Sandbox Code Playgroud)

在第一个循环中,它调用

System.out.println(Object o);  // String, Interger, Float are all objects this causes no issues
Run Code Online (Sandbox Code Playgroud)

在第二个循环中它调用

System.out.println(String str);  // This is where the casting fails, Object, Integer, and Float are not Strings.
Run Code Online (Sandbox Code Playgroud)

原因是运算符重载调用的版本是在编译时确定的(不是运行时).

注意:

实际上,除了List的泛型类型之外,不应该在迭代器上使用泛型类型.在您的情况下,类型默认为对象.