ClassCastException异常

时间:2010-06-22 11:55:49

标签: java casting classcastexception dynamic-cast

我在java中有两个类:

class A {

 int a=10;

 public void sayhello() {
 System.out.println("class A");
 }
}

class B extends A {

 int a=20;

 public void sayhello() {
 System.out.println("class B");
 }

}

public class HelloWorld {
    public static void main(String[] args) throws IOException {

 B b = (B) new A();
     System.out.println(b.a);
    }
}

在编译时它不会给出错误,但在运行时它会显示错误: 线程“main”中的异常java.lang.ClassCastException:A不能转换为B

4 个答案:

答案 0 :(得分:16)

这是因为new A()编译时表达式类型为A - 可能B实例的引用1}},所以允许施法。

但是,在执行时,引用仅仅是A的实例 - 因此它无法进行转换。仅A 的实例不是 B的实例。仅当引用确实引用B或子类的实例时,该转换才有效。

答案 1 :(得分:7)

B扩展A,因此B可以转换为A.但反之则不然。 A的实例不能转换为B。

如果您来自Javascript世界,您可能希望这可以工作,但Java没有“duck typing”。

答案 2 :(得分:1)

首先这样做:

  A aClass = new B(); 

现在进行显式投射,它将起作用:

   B b = (B) aClass;

这意味着明确的演员必须要隐式演员。 elsewise不允许显式转换。

答案 3 :(得分:0)

创建子类的对象后,无法将其类型转换为superClass。请看下面的例子

<强>假设:               Dog是继承自Animal(SuperClass)

的子类

普通的Typecast:

Dog dog = new Dog();
Animal animal = (Animal) dog;  //works

错误的Typecast:

Animal animal = new Animal();
Dog dog = (Dog) animal;  //Doesn't work throws class cast exception

下面的Typecast确实有效:

Dog dog = new Dog();
Animal animal = (Animal) dog;
dog = (Dog) animal;   //This works

编译器检查运行时实际验证内容的语法