gpt4 book ai didi

java - java中的ClassCastException和奇怪的编译问题

转载 作者:行者123 更新时间:2023-12-02 10:50:19 25 4
gpt4 key购买 nike

下面的代码片段有一个奇怪的行为。有人可以详细解释吗

下面的代码抛出 ClassCastException,但 inks.get(0) 给出的 ColorInk 无法转换为 BlackInk,因为没有 IS-A 关系。然后应该给出编译错误为什么编译成功并抛出ClassCastException。

    import java.util.ArrayList;
public class ListAccess {
public static void main(String[] a){
ArrayList<Ink> inks=new ArrayList<Ink>();
inks.add(new ColorInk());
inks.add(new BlackInk());
Ink ink=(BlackInk) inks.get(0);
}
}

class Ink{}
class ColorInk extends Ink{}
class BlackInk extends Ink{}

下面的代码又很奇怪,当只有 Arraylist 泛型是 ColorInk 时,它编译失败而不是 ClassCastException,这两种情况下的区别是什么 list.get(0) 返回 ColorInk ,它被转换为 BlackInk,其中没有 IS-A关系。

import java.util.ArrayList;
public class ListAccess {
public static void main(String[] a){
ArrayList<ColorInk> inks=new ArrayList<Ink>();
inks.add(new ColorInk());
Ink ink=(BlackInk) inks.get(0);
}
}

class Ink{}
class ColorInk extends Ink{}
class BlackInk extends Ink{}

最佳答案

您注意到的行为与继承的基本规则有关。

对于第一个片段,您将 Ink 向下转换为 BlackInk:

Ink ink=(BlackInk) inks.get(0);

编译器接受它,因为 Ink 可能是 BlackInk。但如果转换在运行时无效,则向下转换仍可能失败。这就是 inks.get(0) 引用 ColorInk 时发生的情况。

在第二个片段中:

ArrayList<ColorInk> inks=new ArrayList<Ink>();
...
Ink ink=(BlackInk) inks.get(0);

编译器会阻止您,因为您想要将具有声明类型的对象转换为它无法兼容的类型:根据以下规则,ColorInk 不能是 BlackInk您定义的层次结构。编译器不会等到运行时失败,因为它可能会使编译立即失败,这样更好。

关于java - java中的ClassCastException和奇怪的编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52233160/

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