Java枚举可以实现密封接口吗?[关闭]

gojuced7  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(198)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

昨天关门了。
Improve this question
Java枚举可以在Java中实现密封接口吗?为什么?
密封子类必须是final、密封或非密封的。我的理由是,如果一个枚举可以实现一个密封的接口,它只能是非密封的,因为它不能被标记为final,也不能被扩展,因此它不能被标记为密封的。
我很抱歉,如果有答案somwhere,但我似乎找不到它。

kgsdhlau

kgsdhlau1#

我花了5秒钟来测试它:
Foo.java:

public sealed interface Foo permits Bar {}

Bar.java:

public enum Bar implements Foo {
  A, B {
    void baz() {}
  }
}

枚举甚至实际上有一个子类(表示B的内部类)。

> javac *.java

编译得很好,没有来自javac的抱怨。
从心理模型来看,这是完全有道理的:枚举类型的quacks、walks和swim与final类型类似:枚举不能被其他代码扩展,只能通过重新编译它。是的,枚举可以被“子类化”(这就是上面的B所做的:它创建了一个新的匿名类,或多或少命名为Foo$B extends Foo,其中包含baz()方法,JVM将创建该类的单例示例。当然,除了javac可以管理所有这些。实际上,您无法获得带有实际字母class Foo$B extends Foo {}(其中Fooenum)的实际源文件,并使用符合规范的javac进行编译。
这听起来像是你在问“这是可能的吗”,在这种情况下,[A]是的,[B]我强烈建议你试试这个东西;它比写一个SO问题花费更少的时间,你可以学到更多。
也许你的意思是:“我认为他们不应该,但javac允许它。在这种情况下,它可以分解为两个进一步的变体:“......我对为什么允许这样做感到困惑”(上述解释应足以解释原因),或“......我认为JLS是坏的,因为我读它的方式,你不应该这样做。在这种情况下,如果你愿意的话,可以在openjdk项目中提交一个bug。但是这个bug是在JLS中,而不是在javac中:能够写出上面的内容显然是正确的意图。

相关问题