Scalac未对缺失open关键字发出警告,原因何在?
Scala 3跨文件继承未触发open限制的原因分析
- 核心原因:你把两个文件作为同一编译单元编译了。Scala 3仅限制不同编译单元之间继承未标记
open的非抽象类,同一编译单元内则无此强制要求。 - 验证规则的正确操作:要触发书籍中描述的限制,需要分开编译两个文件:
- 先单独编译基类文件:
scalac animal.scala - 再单独编译子类文件:
scalac cat.scala
此时编译器会报错,提示Animal类是final的,无法被跨编译单元继承。
- 先单独编译基类文件:
- 补充说明:Scala 3设计
open修饰符的初衷是限制跨模块/跨编译单元的继承,避免外部代码随意修改内部类的行为;而同一编译单元内的代码属于同一开发上下文,编译器默认允许自由继承,兼顾封装性和开发效率。
内容的提问来源于stack exchange,提问作者Sama Rive
相关产品推荐
相关产品推荐

