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

时间:2014-06-28 20:56:33

标签: java enums subclass extends

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

以下示例显示:

  1. 我们可以使用正常的枚举E1
  2. 我们可以使用“复杂”枚举E2
  3. 但我们无法通过组合某个类并将其扩展为枚举来获得相同的复杂枚举。
  4. 例如:

    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 
    
        }
    
    
    }
    

2 个答案:

答案 0 :(得分:20)

由于enum已经extendsenum无法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;
    }
}

无论如何,这似乎对你的情况更有意义。

此外,传统上,由于enum值本质上是public static final值,因此以相同的方式命名 - 带下划线的块上限。

修改

来自评论 - 如何覆盖单个enum值中的方法。这通常用于工厂模式。假设我们有WidgetWidgetFactory。我们有两种不同的小部件类型,小型和大型。这些由类SmallWidgetLargeWidget表示。

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的单一继承范式。但是,枚举可以实现接口。