我对java中的角色转换有一些疑问
public class A {
private String superStr;
public String getSuperStr() {
return superStr;
}
public void setSuperStr(String superStr) {
this.superStr = superStr;
}
}
public class B extends A {
private String subStr;
public String getSubStr() {
return subStr;
}
public void setSubStr(String subStr) {
this.subStr = subStr;
}
}
我预计结果如下
public static void main(String[] args) {
A a = fuc();
B b = new B();
b = (B) a;
b.setSubStr("subStr");
System.out.println(a.getSuperStr() + b.getSubStr());
}
private static A fuc() {
A a = new A();
a.setSuperStr("super");
return a;
}
但是爪哇。lang.ClassCastException被记录在案
我该怎么投? 我想使用子类变量和超类变量
谢谢!
# 1 楼答案
不能。只有当所讨论的对象与类型具有“是”关系时,才能进行强制转换。在您的例子中,有一个
A
对象(来自fn
的对象),它不是B
。(所有B
对象都是A
,因为B
扩展了A
,但并非所有A
对象都是B
。)考虑一下:让我们调用}和}:A}都视为}视为
B
{A
{Bird
是一个Animal
,但并不是所有的Animal
都是Bird
。所以我们可以将所有的{Animal
,但我们不能将所有的Animal
都视为Bird
。当使用给定类型的变量引用对象时,您将对象视为该类型(例如,B b = (B)a
尝试将Animal
{Bird
)旁注:代码的指定部分没有意义:
因为下一行赋值给
b
(如果它会编译的话,它会的),所以只在之前把new B()
赋值给b
是没有用的。(除非B
构造函数有副作用,这通常是个坏主意。)™.)# 2 楼答案
其他人已经解释了为什么你不能这么做。我在这里给你一个简单的选择。你的B类可以有一个以a为参数的构造函数,你可以简单地把a包装起来,这样你就可以把它“转换”成B。这样你的代码看起来更干净,它实际上可以工作,你遵循了一个好的设计模式。有关更多信息,请查看Decorator Pattern