【问题标题】:Java downcasting dilemmaJava 向下转型的困境
【发布时间】: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 + ".");


    }
}

执行此代码将使ClassCastExceptioninheritance.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


【解决方案1】:

两者之间的主要区别是 example 是 Object myObj = new String[]{"one", "two", "three"}; 这里 myObj 将引用一个字符串数组,并且由于引用的值确实是一个字符串数组,您可以将其强制转换为一个。 在另一个示例Bike b = (Bike)v; 中,b 的引用值将指向Car。由于Car 不是完整的Bike。自行车可能比汽车执行更多,汽车不知道的事情。因此,您不能将 Car 转换为 Bike

【讨论】:

    【解决方案2】:

    两者不一样:(String[])myObj 是允许的,因为myObj 是一个String[] 实例。但是(Bike)v 是不允许的,因为v 不是Bike 或其任何超类的实例(它是Car 实例)。

    【讨论】:

      【解决方案3】:

      不,提供的代码与您的示例中的代码在一个基本句子中有所不同:

      //you're declaring a Object class variable
      Object myObj = new String[]{"one", "two", "three"};
      //you're declaring a Car class instance, not a Vehicle
      Vehicle v = new Car();
      

      它们不一样。在第一个示例中,您使用父类来保存值,在第二个示例中,您使用子类并分配父值,但对象将是子类,而不是父类。

      让我们看一下类的组成来进一步解释:

      Object
      - String[]
      - Vehicle
        - Car
        - Bike
      

      如您所见,每个String[] 都将是Object,现在每个Car 将是Vehicle,但Car 不是Bike。用代码解释一下

      Vehicle v = new Car();
      //v contains an instance of Car
      Car c = v;
      //a Car is not a Bike, this line will throw an error
      Bike b = c;
      //v2 contains an instance of Vehicle
      Vehicle v2 = new Vehicle();
      //a Car is a Vehicle
      Car c2 = v2;
      //a Bike is a Vehicle
      Bike b2 = v2;
      

      【讨论】:

      • 实际上,根据代码,它类似于Vehicle -> CarVehicle -> Bike。你提到它就像Car -> Vehicle。事实并非如此。
      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多