【发布时间】:2012-09-14 22:15:30
【问题描述】:
请在此处查看此代码。
class Vehicle {
public void printSound() {
System.out.print("vehicle");
}
}
class Car extends Vehicle {
public void printSound() {
System.out.print("car");
}
}
class Bike extends Vehicle{ // also tried to extend Car
public void printSound() {
System.out.print("bike");
}
}
public class Test {
public static void main(String[] args) {
Vehicle v = new Car();
Bike b = (Bike)v;
v.printSound();
b.printSound();
Object myObj = new String[]{"one", "two", "three"};
for (String s : (String[])myObj) System.out.print(s + ".");
}
}
执行此代码将使ClassCastException 说inheritance.Car cannot be cast to inheritance.Bike。
现在查看Object myObj = new String[]{"one", "two", "three"}; 行。该行与Vehicle v = new Car(); 相同,对吗?在这两行中,我们都将子类对象分配给超类引用变量。但是向下转换 String[]myObj 是允许的,但 (Bike)v 是不允许的。正如评论中提到的,我还尝试使用自行车来扩展 Car。根据这里的一些讨论,自行车不是汽车,因为它是扩展车辆。如果我通过 Bike 扩展 Car,则意味着 Bike 是 Car 的一种,但仍然存在异常。
请帮助我了解这里发生了什么。
P.s - 请不要把整辆汽车改装成自行车,把自行车改装成汽车;)
【问题讨论】:
-
您正试图将
Car转换为Bike。但是Car不继承自Bike。反之亦然。 -
不幸的是,这种语言不像英语那样现实和合乎逻辑。所以是的,我想把汽车变成自行车
-
或者更确切地说,大多数编程语言... :)
-
请查看编辑。正如 Cratylus 所说,汽车和自行车是无关的。我从一辆车上伸出自行车。我仍然遇到同样的异常
-
随您的编辑。从概念上讲,
Car不是Bike,因此您无法将它们相互转换是有道理的。
标签: java