两个班级:
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
?
答案 0 :(得分:1)
问题在于您尝试将ClassA
向下转换为ClassB
,这是不允许的,因为实际对象可能是ClassX
({{1}的另一个子类没有显式转换的。}
请参阅以下示例,该示例将抛出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
答案 1 :(得分:1)
Java中的强制转换不像dynamic_cast&lt; ...&gt; C ++中的指针。对于后者,如果类型不兼容,则结果为空指针。在Java中,转换不兼容的引用会产生ClassCastException
。
通常的Java习惯用法是使用instanceof
预先测试引用,然后仅在结果为true时执行转换。例如,
ClassA a = myMethod();
if (a instanceof ClassB) {
ClassB b = (ClassB) a;
...
}
答案 2 :(得分:0)
ClassA不是ClassB可互换的。更改方法以返回ClassC
(界面),并将该引用存储为ClassC
,然后您可以使用ClassA
或ClassB
。 A是-A C,B是-A C,但A不是B,即使B是-A A.如果有帮助的话。