Java 外部项目中的Scala密封类子类化

Java 外部项目中的Scala密封类子类化,java,scala,jvm,Java,Scala,Jvm,引用Scala的文档: 密封类不能直接继承,除非继承模板与继承类在同一源文件中定义。但是,密封类的子类可以在任何地方继承 如果我在我的项目中创建一个密封类的层次结构,那么一切都很好,例如: sealed abstract class Base {} sealed class Derived extends Base {} 但是,如果我编译项目并在Maven中将其作为JAR分发会怎么样呢 如果我在第二个项目中编写了一个Java类,该类的JAR位于类路径上,该怎么办 public class Br

引用Scala的文档:

密封类不能直接继承,除非继承模板与继承类在同一源文件中定义。但是,密封类的子类可以在任何地方继承

如果我在我的项目中创建一个密封类的层次结构,那么一切都很好,例如:

sealed abstract class Base {}
sealed class Derived extends Base {}
但是,如果我编译项目并在Maven中将其作为JAR分发会怎么样呢

如果我在第二个项目中编写了一个Java类,该类的JAR位于类路径上,该怎么办

public class Breaker extends Derived {}
它会继续吗?如果我在Scala中编写
Breaker
,会怎么样


如果密封在上述情况下工作,它是如何实现的?

给定一个空的
密封的
类和一个空的普通类,
javap
转储的区别在于
运行时VisibleAnnotations
的值,因此我认为Scala编译器使用Java注释来区分
密封的
类。
如果您想进一步调查:

因此,只要涉及Scala编译器,就应该与分发方法无关


顺便说一句,派生类的
javap
转储不会改变。

Java没有
密封的
模板的概念,因此Java编译器根本不可能强制执行
密封的
约束,因为它甚至不知道它们的存在

这不是特定于
sealed
,甚至不是特定于Scala/Java。这种事情只有在两种语言都互相了解的情况下才有效(也就是说,Scala编译器需要了解每一种可以用来与之互操作的编程语言,包括那些还不存在的语言,反之亦然,每一种可以用来与Scala互操作的语言的编译器和解释器都需要了解Scala,甚至是编写的编译器在Scala出现之前),他们可以就彼此之间交流这些语义的方法达成一致

当然,让所有语言都知道所有其他语言是O(n²)而且不可扩展,显然让语言知道还不存在的语言是不可能的。因此,我们要做的是定义一种所有语言都知道的通用语言。在Unix上,这是C structs+C函数调用,在CLI上,这是CIL字节码,在Java平台上,这是JVM字节码

这意味着Scala和Java可以通过JVM字节码绕道相互通信,但显然它们只能通信可以用JVM字节码表示的语义。而
sealed
不是其中之一


Scala使用注释在字节码中编码
sealed
,但Java不理解该注释,即使它理解了,它实际上也没有清晰地映射到Java中的任何概念!(与Java接口不同,Java接口清晰地映射到完全抽象的Scala特征).

我认为这仅限于Scala,你可以用Java或其他JVM语言打破封印,直到一切都崩溃。你答案的最后一段就是我想要的。你可以再强调一下!接下来还有两个问题:1)如果我尝试在Scala中扩展
Derived
,在类路径上只编译JAR,编译器会扫描类文件吗?javac是否也出于某种目的扫描类文件?2) 第一个版本的Scala中是否存在
密封的