Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';枚举不能在Java中扩展类吗?_Java_Enums_Subclass_Extends - Fatal编程技术网

为什么可以';枚举不能在Java中扩展类吗?

为什么可以';枚举不能在Java中扩展类吗?,java,enums,subclass,extends,Java,Enums,Subclass,Extends,为什么不能让枚举在Java中扩展某些类 下面的例子表明: 我们可以使用普通enumE1 我们可以使用“复杂”枚举E2 但是我们不能通过组合某个类并用enum扩展它来获得相同的复杂enum 例如: public class Try_ExtendEnum { public static enum E1 { North, East, South, West } public static enum E2 {

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

下面的例子表明:

  • 我们可以使用普通enum
    E1
  • 我们可以使用“复杂”枚举
    E2
  • 但是我们不能通过组合某个类并用enum扩展它来获得相同的复杂enum
  • 例如:

    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
    无法
    扩展另一个类,因为
    enum
    已经
    扩展了enum
    。该类提供了所有
    enum
    功能

    然而,
    枚举可以实现
    接口

    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
    值本质上是一个
    公共静态最终值
    值,因此它的命名方式相同-在带下划线的块大写中

    编辑

    来自注释-如何覆盖单个
    enum
    值中的方法。这通常用于工厂模式。假设我们有一个
    小部件
    和一个
    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
    上具有多态行为可能非常强大。

    根据,每个enum都是隐式最终的,是enum的一个子类。因此,一个枚举已经从另一个类继承,使其成为另一个类的子类将打破Java的单一继承范式。然而,枚举可以实现一个接口。

    @boristesspider可能用户2610529在回答问题时看不到您的答案,直到我发布了我的答案,我才看到您的答案。另外,非常有趣的是,如果需要,您可以分别覆盖每个枚举值的方法。@user2610529添加了一个这样的示例。噢,哇,我不知道Enum可以实现接口!我知道他们自己也可以有抽象的方法,我总是觉得很酷。所以谢谢你告诉我这个消息!实际上,我看到了一个论点,即enum不能扩展另一个类或enum,因为它们已经扩展了enum。这是我在Java中见过的愚蠢的论点。你觉得其他课程怎么样?为什么他们可以扩展其他类,即使他们已经扩展了对象类?@UnKnown
    Object
    是特殊的-一切
    extendingobject
    都作为单亲
    class
    。所以
    Parent->Object
    ,如果我们添加一个子元素,那么
    child->Parent->Object
    <代码>扩展对象
    被添加到编译器未扩展另一个
    的任何
    。Java不支持多重继承。