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

2020-03-17 11:33:48 +08:00
 Newyorkcity

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,也没什么大不了。继承个父类,小意思。 那为什么不可以呢?

谢谢

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

然后给出的代码里用了接口来实现。。。
noreplay
2020-03-17 19:20:08 +08:00
@Newyorkcity 审题不准确,贻笑大方了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/653505

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX