覆盖接口的其他方案

whi*_*hat 0 java interface

请考虑以下代码:

public class Main implements Vehicle, Car {
  public static void main(String[] args) {
    Main generalConcreteClass = new Main();
    System.out.println(((Vehicle) generalConcreteClass).TYPE); //**Line 1**

    Vehicle vehicle = new Main();  //**Line 2**
    System.out.println(vehicle.TYPE);//  Here there is no Ambiguity since vehicle is of TYPE vehicle

    System.out.println(((Car)vehicle).TYPE);  // **Line3** This doesn't throw ClassCastException..
  }
}
Run Code Online (Sandbox Code Playgroud)

这里,Vehicle和Car接口都具有相同的常量TYPE,具有不同的值.

Line1上的generalConcreteClass会有歧义,因此需要进行类型转换,并且可以访问任何一个TYPE.

Line2:车辆对象有车辆界面参考.

第3行:如何将我的车辆对象转换为Car类型并仍然可以访问常量TYPE of Car.如何使车辆物体可见.或者它如何在内部工作?

现在,如果我不使我的类实现Car接口,那么类型的类型转换车辆对象类型Car会抛出ClassCastException.

JB *_*zet 5

静态方法和字段不是多态的.您永远不应该使用实例来访问静态字段.使用Vehicle.TYPECar.TYPE.

如果要以多态方式访问对象的类型,请使用getType()实例方法.

第3行不会抛出ClassCastException,因为对象的具体类型是Main,而Main是Car,因此可以进行转换.