Dim*_*ims 4 java enums extends subclass
为什么不能让枚举在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
}
}
Run Code Online (Sandbox Code Playgroud)
Bor*_*der 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;
}
}
Run Code Online (Sandbox Code Playgroud)
无论如何,这似乎在你的情况下更有意义.
此外,传统上,作为一个enum
值本质上是一个public static final
值,它以相同的方式命名 - 带下划线的块上限.
编辑
来自评论 - 如何覆盖单个enum
值中的方法.这通常用于工厂模式.假设我们有一个Widget
和一个WidgetFactory
.我们有两种不同的小部件类型,小型和大型.这些由类SmallWidget
和LargeWidget
.
interface Widget {}
interface WidgetFactory {
Widget get();
}
class LargeWidget implements Widget {}
class SmallWidget implements Widget {}
Run Code Online (Sandbox Code Playgroud)
现在我们可以实现WidgetFactory
如下enum
:
enum WidgetFactoryImpl implements WidgetFactory {
SMALL {
@Override
public Widget get() {
return new SmallWidget();
}
},
LARGE {
@Override
public Widget get() {
return new LargeWidget();
}
};
}
Run Code Online (Sandbox Code Playgroud)
通常,具有多态行为enum
可能非常强大.