【问题标题】:Java: Cast on Iterator ignore integer except String typeJava:在迭代器上强制转换忽略除字符串类型以外的整数
【发布时间】:2016-10-15 11:27:12
【问题描述】:

有人可以向我解释为什么 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()));
}

结果是:

线程“主”java.lang.ClassCastException 中的异常: java.lang.Object 不能转换为 java.lang.String

不知道是什么原因。

【问题讨论】:

    标签: java string iterator integer classcastexception


    【解决方案1】:

    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 的泛型类型之外,您不应该在迭代器上使用泛型类型。在您的情况下,类型默认为 Object。

    【讨论】:

    • 嗨 cyroxis,但是如果我写这个 Iterator&lt;Integer&gt; crunchifyIterator = list.iterator(); 是允许的,如果我尝试 Iterator&lt;String&gt; crunchifyIterator = list.iterator(); 会抛出异常
    • @Abelo 我更新了我的答案以更加清晰。
    猜你喜欢
    • 2015-11-13
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    相关资源
    最近更新 更多