Приведение подклассов, расширяющих тот же оригинальный класс - PullRequest
5 голосов
/ 26 сентября 2010

Как я могу разыграть два расширенных класса в Java?

    class B extends Object{

    }

    class C extends Object{

    }

    B b = new B();

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

Ответы [ 7 ]

14 голосов
/ 26 сентября 2010

Вы не можете. Рассмотрим небольшое переименование:

class Ford extends Car {

}
class Chevrolet extends Car {

}

Ford ford = new Ford();

Chevrolet chevrolet = (Chevrolet) ford;

Однако оба автомобиля, так что вы можете сказать

Car car = ford;

но не более того.

4 голосов
/ 26 сентября 2010

Вы не можете привести объект 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()
4 голосов
/ 26 сентября 2010

Самое близкое, что вы можете сделать, это использовать интерфейсы

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

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

Как уже указывали другие, вы не можете делать то, что пытаетесь, только с классами.

2 голосов
/ 26 сентября 2010

Вы не можете сделать это, поскольку b не является экземпляром класса C. Можно только преобразовать объект в суперкласс или суперинтерфейс.

1 голос
/ 01 июня 2017

но ... давая эту иерархию class X {} class Z extends X{} class Y extends X{} X z = new Z(); X y = new Y(); Z y2 =(Z)y; Почему компилятор alloweb является преобразованием между Z и Y? Это не работает во время выполнения, очевидно, потому что Z не Y.

1 голос
/ 26 сентября 2010

В данном коде класс B и класс C не находятся в отношениях "есть", поэтому их нельзя привести друг к другу.

Единственное, что Bи у C общим является то, что они оба являются подклассами Object, поэтому они оба могут быть преобразованы в Object.Другими словами, B is-a Object и C is-a 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 имеют общего предка, не означает, что они могут быть взаимозаменяемыми друг с другом.

Следовательно, то, что делается в приведенном выше коде, не может быть выполнено.

1 голос
/ 26 сентября 2010

Вы категорически не можете этого сделать.Вы можете использовать только, если тип, к которому вы применяете, действительно представляет происхождение цели.В этом случае B просто не является экземпляром C (и наоборот).Реальный вопрос в том, почему вы хотите?А чего вы на самом деле пытаетесь достичь?

...