我可以扩展一个类并覆盖封闭的枚举类型吗?

Ori*_*rit 15 java enums

如果我有一个包含enum类型的类,我可以扩展此类并覆盖枚举类型或向此枚举添加更多常量吗?目的是用户将能够在getColor()不知道动态对象是来自基类还是派生类的情况下调用方法.例如:

public class Car {

    private String name;

    private CarColors color;

    public enum CarColors {
        BLUE,
        GREEN
    }

    public Car(CarColors c) {
        color=c;
    }

    public CarColors getColor() {
        return color;
    }
}

public class RacingCar extends Car {

    private CarColors color;

    public RacingCar(CarColors c) {
        color=c;
    }

    public enum CarColors {
        BLUE,
        GREEN,
        RED
    }

    @Override //?????
    public CarColors getColor() {
        return color;
    }
}
Run Code Online (Sandbox Code Playgroud)

在主要:

Car racingCar = new RacingCar();
CarColors color = racingCar.getColor();
Run Code Online (Sandbox Code Playgroud)

Boh*_*ian 28

你不能扩展enum.枚举本质上是一个final类.但是,枚举可以实现,因此结合泛型,你得到:

interface Color{

}
enum CarColor implements Color{
    BLUE,
    GREEN;
}
enum RacingCarColor implements Color{
    BLUE,
    GREEN,
    YELLOW;
}
class Vehicle<T extends Color> {
    protected T color;
    protected Vehicle(T color){
        this.color = color;
    }
    public T getColor(){
        return color;
    }
}

class Car extends Vehicle<CarColor>{ 
    public Car(CarColor color){
        super(color);
    }
}

class RacingCar extends Vehicle<RacingCarColor>{ 
    public RacingCar(RacingCarColor color){
        super(color);
    }
}
Run Code Online (Sandbox Code Playgroud)

瞧!


如果您想要要求类型为a Color 并且是枚举,请使用此绑定:

class Vehicle<T extends Enum<T> & Color> { ...
Run Code Online (Sandbox Code Playgroud)

或者一个奇怪的等价物:

class Vehicle<T extends Enum<? extends Color>> { ...
Run Code Online (Sandbox Code Playgroud)

  • 添加泛型非常有帮助。谢谢。:) (2认同)

Hun*_*ran 8

我可以扩展此类并覆盖枚举类型或向此枚举添加更多常量吗?

您的情况中的问题被称为隐藏而不是覆盖枚举,并且上面两个枚举不相互关联.如果您将覆盖引用为扩展枚举类型,因为已经使用关键字final声明了枚举,则无法创建枚举类型的子类型以添加​​更多常量.

目的是用户将能够在不知道动态对象是来自基类还是派生类的情况下调用getColor()方法

你在覆盖方法getColor时是不正确的.尽管如此,你在子类中使用此方法RacingCar与超类Car中的方法具有相同的签名.您仍然忘记了返回类型必须与超类中的返回类型相同,或者是被重写方法的返回类型的子类型.我们有两个不同的枚举,共享一个名称CarColors.换句话说,子类中枚举的完全限定名称是RacingCar.CarColors,而超类中的名称是Car.CarColors.到目前为止,您已经破坏了重写方法的规则,而不是相同的返回类型,而不是超类的返回类型的子类型.

在这个问题上,我们不能创建一个子类型,你不想将YELLOW插入到超类Car的枚举CarColors中,这是我的解决方案.

interface IColor{

}
enum CarColors implements IColor{
    BLUE,
    GREEN;
}
enum RacingCarColors implements IColor{
    BLUE,
    GREEN,
    YELLOW;
}
class Car {
    protected IColor color;
    public Car(IColor color){
        this.color = color;
    }
    public IColor getColor(){
        return color;
    }
}
class RacingCar extends Car{
    public RacingCar(IColor color){
        super(color);
    }
    public IColor getColor(){
        return color;
    }
}



public class Test{
    public static void main(String[] args) {
        Car car = new RacingCar(RacingCarColors.YELLOW);
        System.out.println(car.getColor());

    }
}
Run Code Online (Sandbox Code Playgroud)

该方法仍然覆盖方法getColor,但我使用了一个相同的返回类型IColor,在您的示例中,接口是两个枚举的超类型.该解决方案完全符合您的期望,但这可能很复杂.