gpt4 book ai didi

java - Upcast 给出 ClassCastException

转载 作者:行者123 更新时间:2023-11-30 04:05:58 25 4
gpt4 key购买 nike

两个类:

public class ClassA implements ClassC {
private static final long serialVersionUID = 1111111111111111111L;
public String varA;
}

public class ClassB extends ClassA implements ClassC {
private static final long serialVersionUID = 4604935970051141456L;
public String varB;
}

在我的代码中我有这样的声明:ClassB classB;

和一个方法

myMethod()

返回一个ClassA对象。

如果我写:

classB = (ClassB) myMethod();

我以为我会:

classB.varA = <a value from myMethod()>
classB.varB = null

但事实并非如此:我收到 ClassCastException

为什么?如何快速地将 myMethod()分配给 ClassB

最佳答案

问题是您试图将 ClassA 向下转换为 ClassB,这是不允许的,因为实际对象可能是 ClassX(ClassA 的另一个子类),没有显式转换。

请参阅以下示例,它将抛出 ClassCastException (但编译得很好):

public class Main {
public static void main(String[] args) {
SubB var = (SubB) someMethod();
}

private static Super someMethod(){
return new SubA();
}
}

class Super { }
class SubA extends Super { }
class SubB extends Super { }

代码完美编译:

  • someMethod() 返回 Super 类型的类。
  • SubA 扩展了 Super,因此不会违反方法定义
  • SubB 扩展了 Super,因此它可以将 Super 类型的对象转换为 SubB

然而,当您执行此操作时,您将尝试将 SubA 类型的对象强制转换为 SubB,这是不可能的。

旁注:

  • 不要使用ClassC来命名接口(interface)
  • 在类名中放入层次结构作为小示例(Super <-> Sub)而不是(A <-> B <-> C)

关于java - Upcast 给出 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20707739/

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