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;
}
但是java.lang.ClassCastException是ocuured。
我该如何投这个? 我想使用子类变量和超类变量。
谢谢
答案 0 :(得分:2)
我该如何投这个?
你做不到。只有在相关对象与类型具有“是”关系时才能进行投射。在您的情况下,您有一个A
对象(来自fn
的对象),而不是B
。 (所有B
个对象都是A
个,因为B
扩展了A
,但并非所有A
个对象都是B
s。)
考虑:让我们致电B
Bird
和A
Animal
:Bird
是Animal
,但不是全部Animal
} s是Bird
s。因此,我们可以将所有Bird
视为Animal
,但我们无法将所有Animal
视为Bird
。当您使用给定类型的变量来引用对象时,您将对象视为该类型(例如,B b = (B)a
尝试处理Animal
a
作为Bird
)。
旁注:代码中指出的部分没有意义:
B b = new B();
// ^^^^^^^^^^
b = (B) a;
由于下一行分配给b
(好吧,如果它可以编译),执行new B()
并且事先将其分配给b
没有任何目的。 (除非B
构造函数有副作用,这通常是一个坏主意™。)
答案 1 :(得分:0)
Casting对另一种类型的特定对象不会神奇地将其转换为该类的实例(或至少not in Java);因此,变量a
引用的对象不例如尽管subStr
执行b
后引用的对象确实存在,但仍要使用字段B b = new B();
。
答案 2 :(得分:0)
其他人已经解释了为什么你不能这样做。我在这里给你一个简单的选择。你的B类可以有一个带有A as参数的构造函数,你只需要包装那个A,这样就可以"转换"使用它你的代码会看起来更干净,它实际上会工作,你遵循一个良好的设计模式。有关更多信息,请查看Decorator Pattern