密封类可以列出的子类的最大数量是多少(类似于接口):
public sealed class Foo permits A, B, C {
// How many sub classes can ^^^^^^^
// be listed here?
}
Run Code Online (Sandbox Code Playgroud)
该语言实际上是否定义了限制?即,在语言层面上它实际上是无限的吗?
如果语言层面没有这样的限制,那么似乎实现仍然必须有技术限制。某个地方应该有一个列表来存储允许的子类的某种表示形式。我希望那时使用 16 或 32 位整数。
Bri*_*etz 19
这里的答案是正确的,但我要补充一点,即使在 JVMS 4.7.31(PermittedSubtypes属性)中,您也找不到特定的限制。但由于每个允许的子类型都必须对应Constant_Class_info常量池中的a,而常量池限制为64K条目,并且每个Class常量都有一个关联String常量,所以无论如何你都不能获得超过32K的条目。当然,你的类中可能还有其他东西,它们会竞争常量池,所以你也不会得到它。但答案实际上是“数千”。
rzw*_*oot 12
JLS(Java 语言规范)通常不包含任何限制。尽管有很多限制。JVMS(Java 虚拟机规范)包含了限制。这是有道理的:其中许多限制从根本上与字节码和类文件格式概念相关,而这些概念是 JLS 不知道的 - 换句话说,即使 JLS 想要,它也不可能知道用 JLS 中定义的术语描述限制。
\n例如,方法的最大大小是在字节码指令中“测量”的,这首先不是 Java 语言的概念。
\n因此,JVMS 是寻找此类限制的地方。例如JVM 规范 \xc2\xa74.7.31(由 @akarnokd 提供,很好找到!)。
\n有以下限制:
\nimplements列表finally附加到带有大量块的尝试上catch。为所有这些块复制了finally 块。嵌套 try 块以实现指数级字节码增长!我确信我忘记了一些。
\n还有一些未在规范中列出的限制;例如内存和堆大小限制,以及有关命令行开关的许多详细信息(例如,在一堆 JVM 版本和操作系统上,任何不能-Xss被单词整除的参数(设置堆栈大小))边界\',其定义取决于操作系统和体系结构,被完全忽略) - 全部未指定。
其中一些是有意义的(关于您真正可以保留多少堆的确切细节取决于太多因素,无法详细记录),其中一些确实没有意义(事实上,工具开关的作用就像它们一样)高度规范,两者都有 2 层“较少规范”,-X并且-XX与 JVMS 和 JLS 都没有详细提及可用工具或其命令行开关的想法并没有很好地契合。
| 归档时间: |
|
| 查看次数: |
1461 次 |
| 最近记录: |