为什么不能让枚举扩展 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
}
}
最佳答案
安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
value 本质上是一个 public static final
value 它以相同的方式命名 - 在带下划线的大写字母中。
编辑
来自评论-如何覆盖个人的方法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
上具有多态行为可以非常强大。
关于java - 为什么枚举不能扩展 Java 中的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24470895/