Java 我可以扩展类并重写封闭的枚举类型吗?

Java 我可以扩展类并重写封闭的枚举类型吗?,java,enums,Java,Enums,如果我有一个包含enum类型的类,我可以扩展该类并覆盖该enum类型,还是向该enum添加更多常量? 其目的是用户能够调用getColor()方法,而不知道动态对象是来自基类还是派生类。 例如: public class Car { private String name; private CarColors color; public enum CarColors { BLUE, GREEN } public Ca

如果我有一个包含
enum
类型的类,我可以扩展该类并覆盖该enum类型,还是向该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;
    }
}
总的来说:

Car racingCar = new RacingCar();
CarColors color = racingCar.getColor();
我是否可以扩展此类并重写枚举类型或向该枚举添加更多常量

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

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

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

在这种情况下,我们无法创建子类型,您也不希望在超级类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());

    }
}

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

您无法扩展
enum
。枚举本质上是一个
最终类。但是,枚举可以实现,因此结合泛型,您可以得到:

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);
    }
}
或者一个奇怪的等价物:

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

classvehicle
Enum
正是扩展
java.lang.Enum
的最终内部类。您不能扩展、重写或继承
枚举

另请参见,向其添加泛型非常有用。谢谢。:)出于某种原因,在使用java 7的eclipse中,我不得不这样做,因为它告诉我“类型Enum不是一个接口,不能指定为绑定参数”@user779420这是我的错误:规则是,如果类是交集的一个边界,则必须首先列出它。(我在iPhone上输入了它——没有要检查的编译器)。Thx@Bohemian哈哈,那是几年前的事了,我没想到会有任何反应!谢谢
class Vehicle<T extends Enum<? extends Color>> { ...