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