java - 为什么枚举不能扩展 Java 中的类?

标签 java enums subclass extends

为什么不能让枚举扩展 Java 中的某些类?

下面的例子表明:

  1. 我们可以使用普通枚举 E1
  2. 我们可以有“复杂的”枚举E2
  3. 但是我们不能通过组合一些类并用枚举扩展它来获得相同的复杂枚举。

例如:

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/

相关文章:

java - 当不使用 URL 读取 QR 码时,zxing QRCodeReader 中的 ChecksumException

java - 导出文件编码问题

java - 如何在Json Parser android中设置请求超时

javascript - 如何使用/定义具有流类型检查的枚举?

python - 覆盖父类的方法

java - 抑制 ScheduledThreadPoolExecutor 中的冗余作业

c# - 为枚举创建自定义 DisplayAttribute?

python - 如何使用 Enum.__members__ 无法访问的私有(private)枚举值?

c++ - 窗口 Hook 问题

c++ - 序列化模板化子类