作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我混淆了两个代码片段:
List list = new ArrayList();
list.add("1");
Iterator<Integer> iterator = list.iterator();
System.out.println(iterator.next());
此代码正常执行并输出 1
到控制台
List list = new ArrayList();
list.add(1);
Iterator<String> iterator = list.iterator();
System.out.println(iterator.next());
它的结果 - RuntimeException
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
我很困惑,因为这两行都是错误的:
Integer integer = "123";
String string = 1;
编译错误
为什么 generis 的行为不同?
附言
我正在准备 scjp 考试,不要混用原始类型和泛型;
最佳答案
PrintStream
, 类 System.out
, 有多个 println
过载。特别是,它有 an overload that takes an Object
和 an overload that takes a String
.
在第一个例子中,
List list = new ArrayList();
list.add("1");
Iterator<Integer> iterator = list.iterator();
System.out.println(iterator.next());
编译器期望 iterator.next()
产生一个Integer
,最匹配的是 Object
println
的版本.编译器生成对 Object
的调用该方法的版本,恰好适用于 String
实际上来自迭代器。
在第二个例子中,
List list = new ArrayList();
list.add(1);
Iterator<String> iterator = list.iterator();
System.out.println(iterator.next());
编译器期望 iterator.next()
产生一个String
,最匹配的是 String
println
的版本.编译器生成对 String
的调用该方法的版本,并且由于类型删除(这使得运行时类型为 iterator.next()
Object
),它从 Object
生成运行时转换至 String
.此转换对于 Integer
失败它实际上来自迭代器,导致您看到的异常。
关于java - 泛型 collections.mixin 原始类型和泛型类型。 Integer -> String - 异常但 String -> Integer 效果很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24023634/
我是一名优秀的程序员,十分优秀!