试图了解转换和继承

时间:2014-02-10 17:42:33

标签: casting

所以我正在玩铸造......我似乎遇到了问题。

class Rabbit implements Cloneable {
private int r;
public Rabbit(int y) {
    r= y;
}
public Object clone() {
    Object result = new Rabbit(this.r);
    return result;
}

class Bunny extends Rabbit {
private int b;
public Truck(int z) {
    super(z);
    b = z;
}
public Object clone() {
    Object result = super.clone();
    (Bunny) result).b = this.b;
    return result;
}

为什么我在实施过程中不断获得classcastexception?

1 个答案:

答案 0 :(得分:0)

了解在Java中(someType)的“强制转换”符号用于三种不同的(并且很大程度上不相关)的事情:

  1. 在原始类型之间进行强制转换,例如将int转换为char时。在这种情况下,可以修改实际值(例如,通过修剪无关位)。
  2. (在极少数情况下)强制“装箱”/“取消装箱”将int转换为Integer
  3. 断言与声明的类型相反的对象引用的类型。
  4. 第三种用途就是你所关心的。重要的是要理解,与其他两个不同,它不会以任何方式修改对象引用或对象本身的运行时值。相反,它告诉编译器(和JVM“验证器”)“嘿,编译器,我知道这个引用被声明为ObjectA引用,但它确实引用了一个ObjectB - 相信我!”因此编译器接受该语句,但JVM是一个不信任的灵魂,坚持在运行时检查。如果引用的对象不是ObjectB(或ObjectB的某个子类),则抛出ClassCastException。