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

时间:2011-06-08 16:35:38

标签: 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;
    }
}

并在主要:

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

3 个答案:

答案 0 :(得分:26)

您无法展开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);
    }
}

瞧!


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

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

或者好奇的等同物:

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

答案 1 :(得分: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());

    }
}

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

答案 2 :(得分:0)

Enums正是扩展java.lang.Enum<E>的最终内部类。您无法扩展,覆盖或继承enum