为什么enum不能在Java中扩展类?

Dim*_*ims 4 java enums extends subclass

为什么不能让枚举在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 

    }


}
Run Code Online (Sandbox Code Playgroud)

Bor*_*der 20

一个enum不能extends另一个类,因为enum已经extends Enum<T>.该类提供了所有enum功能.

一个enum可以,但是,implementsinterface:

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.我们有两种不同的小部件类型,小型和大型.这些由类SmallWidgetLargeWidget.

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可能非常强大.

  • @UnKnown`Object`很特别 - 一切`扩展Object`作为**单父`class`**.所以`Parent - > Object`,如果我们添加一个孩子然后`Child - > Parent - > Object`.`extends Object`被添加到编译器中没有`扩展'另一个`class`_的任何`class` _中.Java确实**不支持多重继承. (2认同)