是否可以扩展类并重写封闭的枚举类型?

2022-09-03 09:21:24

如果我有一个包含类型的类,是否可以扩展该类并重写枚举类型或向此枚举添加更多常量?目的是用户将能够调用方法,而不知道动态对象是来自基类还是派生类。例如:enumgetColor()

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;
    }
}

和主要:

Car racingCar = new RacingCar();
CarColors color = racingCar.getColor();

答案 1

您无法扩展 .枚举本质上是一个类。但是,枚举可以实现,因此与泛型结合使用,您可以获得:enumfinal

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);
    }
}

瞧!


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

class Vehicle<T extends Enum<T> & Color> { ...

或者一个奇怪的等价物:

class Vehicle<T extends Enum<? extends Color>> { ...

答案 2

是否可以扩展此类并重写枚举类型或向此枚举添加更多常量?

您情况下的问题称为隐藏而不是覆盖枚举,并且上面的两个枚举彼此不相关。如果将重写称为扩展枚举类型,则由于枚举已使用关键字 final 声明,因此无法创建枚举类型的子类型来添加更多常量。

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

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

在这件事上,我们无法创建子类型,你也不想在超级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());

    }
}

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