如何在java中强制转换两个扩展类?
class B extends Object{
}
class C extends Object{
}
B b = new B();
C c = (C)b;//Cannot cast from B to C
答案 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”关系,因此它们不能相互转换。
B
和C
的唯一共同点是它们都是Object
的子类,因此,它们都可以转换为Object
。换句话说,B
是 - Object
而C
是 - 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
方法,它会怎么做?
可以看出,仅仅因为B
和C
具有共同的祖先并不意味着它们可以相互互换。
因此,无法执行上述代码中的尝试。
答案 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.