转换子类扩展相同的原始类

时间:2010-09-26 16:17:07

标签: java casting subclass

如何在java中强制转换两个扩展类?

    class B extends Object{

    }

    class C extends Object{

    }

    B b = new B();

    C c = (C)b;//Cannot cast from B to C

7 个答案:

答案 0 :(得分:13)

你做不到。考虑稍微重命名:

class Ford extends Car {

}
class Chevrolet extends Car {

}

Ford ford = new Ford();

Chevrolet chevrolet = (Chevrolet) ford;

然而,两者都是汽车,所以你可以说

Car car = ford;

但不仅仅是那个。

答案 1 :(得分:4)

你最接近的是使用接口

 class B extends Object implements Thing {}
 class C extends Object implements Thing {} 

 B b = new B()
 Thing c = (Thing)b

正如其他人所说,你不能只用课程来做你想做的事。

答案 2 :(得分:3)

您无法将对象B强制转换为C,因为B不是C,您可以推断的最好的是Object }。这是另一个类比:

class Animal {
    public void eat();
}

class Dog extends Animal {
    public void bark();
}

public Cat extends Animal {
    public void meow();
}

说你有:

Cat sprinkles = new Cat();

// this doesn't make sense
Dog aDog = (Dog) sprinkles;
aDog.bark(); // can't do this because sprinkles can't bark()

// but this does
Animal myCat = (Animal) sprinkles;
myCat.eat(); // but it can eat()

答案 3 :(得分:2)

你不能这样做,因为b不是C类的实例。只能将对象强制转换为超类或超级接口。

答案 4 :(得分:1)

你绝对不能这样做。如果您要投射的类型实际上代表目标的祖先,则只能进行投射。在这种情况下,B根本不是C的实例(反之亦然)。真正的问题是你为什么要这样做?你究竟想要完成什么?

答案 5 :(得分:1)

在给定的代码中,类B和类C不是“is-a”关系,因此它们不能相互转换。

BC的唯一共同点是它们都是Object的子类,因此,它们都可以转换为Object。换句话说,B是 - ObjectC是 - Object

B b = new B();
Object ob = (Object)b;

C c = new C();
Object oc = (Object)c;

作为正在做的事情的一个反例,想象一下这个案例:

class B extends Object {
    public void doSomething();
}

class C extends Object {
    public void doAnotherThing();
}

在这种情况下,以下代码应该做什么?

C realC = new C();
realC.doSomething();   // This is OK.

B c = (B)realC;
c.doSomething();       // ???

由于从C类创建的对象没有doSomething方法,它会怎么做? 可以看出,仅仅因为BC具有共同的祖先并不意味着它们可以相互互换。

因此,无法执行上述代码中的尝试。

答案 6 :(得分:1)

但......给出了这个层次结构 class X {} class Z extends X{} class Y extends X{} X z = new Z(); X y = new Y(); Z y2 =(Z)y; 为什么编译器允许在Z和Y之间进行转换?它在运行时不起作用,显然cos Z不是Y.