[英]I have some issue about casting in 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;
}
但是出现了java.lang.ClassCastException。
我该如何投放? 我想使用子类变量和超类变量。
谢谢
我该如何投放?
你不能 仅当所讨论的对象与类型具有“是”关系时,才可以强制转换。 在您的情况下,您有一个A
对象( fn
的一个),它不是B
(所有B
对象都是A
,因为B
扩展了A
,但并非所有A
对象都是B
)
试想一下:让我们把B
Bird
和A
Animal
:一个Bird
是一种Animal
,但并非所有的Animal
s为Bird
秒。 因此我们可以将所有Bird
视为Animal
,但是不能将所有Animal
视为Bird
。 当您使用给定类型的变量来引用对象时,您会将对象视为该类型的对象(例如, B b = (B)a
试图将Animal
a
视为Bird
)。
旁注:没有指向代码的指示部分:
B b = new B();
// ^^^^^^^^^^
b = (B) a;
由于下一行将分配给b
(好吧,如果可以编译的话),所以做new B()
并事先将其分配给b
没有任何目的。 (除非B
构造函数具有副作用,这通常是Bad Idea™。)
其他人已经解释了为什么您不能这样做。 我在这里给你一个简单的选择。 您的B类可以有一个以A作为参数的构造函数,您只需将A换行即可,就可以将其“转换”为B。这样,您的代码看起来会更简洁,它实际上会工作,并且您遵循的是好的设计模式。 有关更多信息,请查看装饰器模式
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.