当前位置: 首页 > 知识库问答 >
问题:

Java*密封*类/接口:最大子类数

崔恺
2023-03-14

可以为密封类列出的子类的最大数量是多少(类似于接口):

public sealed class Foo permits A, B, C {
   // How many sub classes can  ^^^^^^^
   // be listed here?
}

语言是否真的定义了一个限制;即,在语言层面上它实际上是无限的吗?

如果在语言层面上没有这样的限制,那么实现似乎仍然必须有技术限制。某个地方应该有一个列表,存储允许的子类的某种表示。我希望那时使用16或32位整数。

共有1个答案

吕钧
2023-03-14

JLS(Java语言规范)通常不包含任何限制。尽管有很多限制。是JVMS(Java虚拟机规范)包含限制。这是有道理的:许多这些限制从根本上与字节码和类文件格式概念有关,这些概念是JLS不知道的——换句话说,即使JLS愿意,它也不可能用JLS中定义的术语来描述限制。

例如,方法的最大大小是用字节码指令“测量”的,而字节码指令首先不是java语言的概念。

因此,JVM是寻找这些限制的地方。例如,JVM规范§4.7.31(由@akarnokd提供,很好!)。

有以下限制:

  • 类型中的方法数
  • 类型中的字段数
  • 实现列表中的接口数
  • 方法可以具有的参数数
  • 方法“框架”的大小(它需要多少堆栈空间)
  • 本地插槽数的大小。最后2个项目符号或多或少用java语言翻译为您可以拥有的本地var数量的限制。
  • 每个方法的字节码数。达到此限制的最简单方法是将一个大的最终块附加到加载了catch块的try。最终块被复制给所有这些块。嵌套try块以实现指数字节码增长!
  • 您可以在签名中拥有的类型参数数。
  • 常量池中的条目数。这将在java语言中显示为对可以包含在单个类中的文字数量的限制。

我肯定我忘记了一些。

没有规范中的进一步限制;例如内存和堆大小限制,以及关于命令行开关的许多详细信息(例如,在一系列JVM版本和操作系统上,任何不能被“字边界”(其定义取决于操作系统和体系结构)均匀划分的参数(设置堆栈大小)都被完全忽略),所有这些都是未加密的。

其中一些是有意义的(关于您真正可以保留多少堆的确切细节取决于太多的因素,无法尝试详细记录),有些确实没有(事实上,工具开关的行为就像它们是高规格的,在-X-XX中都有两层“规格较低的”,这与JVM和JLS都没有详细提到可用的工具或其命令行开关的想法不太吻合。

 类似资料:
  • 下面的代码在无法通过条件颜色时编译。深色和彩色。浅色,因为这两个类是抽象的。 我错过什么了吗?

  • 主要内容:数据类,密封类数据类 Kotlin 可以创建一个只包含数据的类,关键字为 data: 编译器会自动的从主构造函数中根据所有声明的属性提取以下函数: / 格式如 对应于属性,按声明顺序排列 函数 如果这些函数在类中已经被明确定义了,或者从超类中继承而来,就不再会生成。 为了保证生成代码的一致性以及有意义,数据类需要满足以下条件: 主构造函数至少包含一个参数。 所有的主构造函数的参数必须标识为 或者 ; 数据类不可

  • 数据类 Kotlin 可以创建一个只包含数据的类,关键字为 data: data class User(val name: String, val age: Int) 编译器会自动的从主构造函数中根据所有声明的属性提取以下函数: equals() / hashCode() toString() 格式如 "User(name=John, age=42)" componentN() functio

  • 我有一个父类和子类、和,它们描述了如何购买水果的不同类型。 在篮子里插入购买的特定水果; 计算购买水果的总价值; 计算用于给定类型水果(水果名称)的总金额 为了与其他项目的类兼容,在各个类中使用的执行要支付金额的计算的方法将具有名称payFruit,返回类型double并且没有参数。此方法必须在接口中声明。 注意:我知道这可能对我的情况很特殊,对其他人没有太大帮助,但我发现这个类层次结构在使用时有

  • 主要内容:Java16 sealed密封类的示例Java 15 引入了一个密封类作为预览功能,它提供了对继承的细粒度控制。Java 16 提供了一些小的增强功能,并将此功能保留为预览版。以下是密封类需要考虑的要点 : 密封类是使用 sealed 关键字声明的。 密封类允许使用 permit 关键字声明哪个类可以是子类型。 扩展密封类的类必须声明为sealed 、non-sealed或final的。 密封类有助于在继承中创建有限且可确定的类层次结

  • 主要内容:Java15 sealed 密封类的示例Java 15 引入了一个密封类作为预览功能,它提供了对继承的细粒度控制。以下是密封类需要考虑的要点 : 密封类是使用 sealed 关键字声明的。 密封类允许使用 permit 关键字声明哪个类可以是子类型。 继承密封类的类必须声明为sealed 、non-sealed或final的。 密封类有助于在继承中创建有限且可确定的类层次结构。 Java15 sealed 密封类的示例 ApiTeste