java - 泛型 collections.mixin 原始类型和泛型类型。 Integer -> String - 异常但 String -> Integer 效果很好

标签 java generics casting type-conversion type-erasure

我混淆了两个代码片段:

片段1

    List list = new ArrayList();
    list.add("1");
    Iterator<Integer> iterator = list.iterator();
    System.out.println(iterator.next());

此代码正常执行并输出 1 到控制台

片段2

    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/

相关文章:

c# - 如何将对象转换为未知类型 T 的 IList<T>

java - 在不对返回类型进行类型转换的情况下调用工厂

swift - 您可以强制使用两种类型的泛型来确保这些类型不相同吗?

C#要在类中使用泛型委托(delegate)也有泛型

java - 从命令行执行 jar 时,属性文件会读取旧数据

c - 如何将结构类型转换为分配的 char 内存空间

macos - 快速类型转换

java - 帮助使用 Spring 创建图像 servlet

java - 类引用取自不同的 jar

java - 使用 Excelsior-jet maven 插件构建多组件应用程序