V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

Java 的枚举内不能有枚举是特别的约定,还是会造成编译上的问题?

  •  
  •   Newyorkcity · 2020-03-17 11:33:48 +08:00 · 945 次点击
    这是一个创建于 1493 天前的主题,其中的信息可能已经有所发展或是发生改变。

    java 编程思想说枚举中不能有枚举,所以很遗憾地想要给枚举分组的话,就要上接口,比如:

    public interface Animal { //这里 interface 改成 enum 是不可以的
        enum Bird{
            magpie,eagle;
        }
    
        enum mammal {
            elephant,lion;
        }
    }
    

    然而为什么不能? 枚举最终被编译为 public final class xxxxx extends Enum,除了java.lang.Enum占据了唯一一个继承的名额,使枚举不能再继承其它类外,可以将枚举看作一个普通的类。 那么这个类里,有 public final 的,继承 java.lang.Enum 的内部类,也没什么问题啊? 内部类 public,没什么问题。final,也没什么大不了。继承个父类,小意思。 那为什么不可以呢?

    谢谢

    noreplay
        1
    noreplay  
       2020-03-17 12:48:39 +08:00 via Android
    最终类不能继承吧。最终类被继承,你就可以通过重载等手段改变最终类的行为。那就和最终相悖了。
    wysnylc
        2
    wysnylc  
       2020-03-17 13:31:18 +08:00
    禁止套娃
    Newyorkcity
        3
    Newyorkcity  
    OP
       2020-03-17 13:40:24 +08:00
    @noreplay 啊?这里没有继承吧?内部类会默认继承外部类吗?
    @wysnylc 禁止套娃可还行
    ChenFanlin
        4
    ChenFanlin  
       2020-03-17 14:29:00 +08:00   ❤️ 1
    是可以的呀, 你大概只是漏了个分号?
    Newyorkcity
        5
    Newyorkcity  
    OP
       2020-03-17 17:50:22 +08:00
    @ChenFanlin wocao!谢谢你亲手写代码还截图!
    ChenFanlin
        6
    ChenFanlin  
       2020-03-17 18:01:27 +08:00
    @Newyorkcity #5 "枚举中不能有枚举,所以很遗憾地想要给枚举分组的话,就要上接口"
    所以这句的原话是啥呢?
    Newyorkcity
        7
    Newyorkcity  
    OP
       2020-03-17 18:18:21 +08:00
    @ChenFanlin
    java 编程思想第四版
    19.7
    使用接口组织枚举无法从 emm 继承子类有时很令人沮丧。这种需求有时源自我们希望扩展原 enum 中的元素,有时是因为我们希望使用子类将一个 enm 中的元素进行分组。
    在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组,可以达到将枚举元素分类组织的目的。举例来说,假设你想用 enm 来表示不同类别的食物,同时还希望每个 enum 元素仍然保持 Food 类型。那可以这样实现:

    然后给出的代码里用了接口来实现。。。
    noreplay
        8
    noreplay  
       2020-03-17 19:20:08 +08:00 via Android
    @Newyorkcity 审题不准确,贻笑大方了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   956 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:03 · PVG 06:03 · LAX 15:03 · JFK 18:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.