gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:46:13 25 4
gpt4 key购买 nike

我混淆了两个代码片段:

片段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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com