为什么不能让枚举在Java中扩展某些类?
以下示例显示:
E1
。E2
。例如:
public class Try_ExtendEnum {
public static enum E1 {
North,
East,
South,
West
}
public static enum E2 {
North(0),
Eash(90),
South(180),
West(270);
private double degrees;
E2(double degrees) {
this.degrees = degrees;
}
public double getDegrees() {
return degrees;
}
}
public static class DegreesMeasure {
private double degrees;
public DegreesMeasure(double degrees) {
this.degrees = degrees;
}
public double getDegrees() {
return degrees;
}
}
public static enum E3 extends DegreesMeasure {
North(0),
Eash(90),
South(180),
West(270);
E3(double degrees) {
super(degrees);
}
}
public static void main(String[] args) {
DegreesMeasure dm = new DegreesMeasure(123);
E3 e = dm; // should not be possible, since E3 is a subclass and not obliged to hold superclass
DegreesMeasure dm2 = E3.Nort; // just holding "tagged" version of instance; see no any problem
}
}
答案 0 :(得分:20)
由于enum
已经extends
,enum
无法extends Enum<T>
另一个班级。该类提供了所有enum
功能。
enum
可以是implements
和interface
:
public interface DegreesMeasure {
double getDegrees();
}
public enum E3 implements DegreesMeasure {
NORTH(0),
EAST(90),
SOUTH(180),
WEST(270);
private final double degrees;
E3(double degrees) {
this.degress = degrees;
}
@Override
public double getDegrees() {
return degrees;
}
}
无论如何,这似乎对你的情况更有意义。
此外,传统上,由于enum
值本质上是public static final
值,因此以相同的方式命名 - 带下划线的块上限。
修改强>
来自评论 - 如何覆盖单个enum
值中的方法。这通常用于工厂模式。假设我们有Widget
和WidgetFactory
。我们有两种不同的小部件类型,小型和大型。这些由类SmallWidget
和LargeWidget
表示。
interface Widget {}
interface WidgetFactory {
Widget get();
}
class LargeWidget implements Widget {}
class SmallWidget implements Widget {}
现在我们可以将WidgetFactory
实现为enum
,因此:
enum WidgetFactoryImpl implements WidgetFactory {
SMALL {
@Override
public Widget get() {
return new SmallWidget();
}
},
LARGE {
@Override
public Widget get() {
return new LargeWidget();
}
};
}
通常,enum
上的多态行为可能非常强大。
答案 1 :(得分:3)
根据the Java Language Specification, Chapter 8,每个枚举都是隐式最终的,并且是Enum的子类。因此,枚举已经从另一个类继承,使其成为另一个类的子类将破坏Java的单一继承范式。但是,枚举可以实现接口。