2010-12-16 31 views
12

可以在Scala中定義sealed類,除非子類在同一個文件中發生,否則基本上都是final在Java中是否實施了密封類,如果是,如何實現?

看來,JVM不允許final類字節碼它的子類。

考慮到字節碼中沒有源文件的「概念」,這個限制是如何執行的?

因此,javac如何防止Scala sealed類在Java中被分類?

+0

所以,爲了澄清一下,你問是否有可能在JVM上運行Scala代碼中的密封類(不是**),在Java *語言中可能有類似於'密封'類)。對? – 2010-12-16 12:07:00

+0

你的意思是「看來JVM不允許最終的類字節碼」?沒有字節碼標記類最終? – pedrofurla 2010-12-16 12:16:34

+0

@pedrofurla:AFAIK JVM不允許在字節碼中標記爲「final」的類的子類?或者這個限制只在'javac'中執行? – soc 2010-12-16 12:24:36

回答

15

這個限制是scalac在編譯時爲Scala源強制執行的。由此產生的二進制類定義沒有設置JVMs最終標誌,正如您現在可能已經猜到的那樣,當針對Scala二進制文件編譯Java源代碼時,javac不會強制執行密封的限制。

+0

是否可以在Java/JVM端執行它(例如通過'sealed class'構造函數中的包檢查),即使它僅在運行時? – Adowrath 2017-05-07 10:28:49

1

如何使用私人構造函數爲要封閉的類,然後創建公共最終靜態內部類來擴展該類。然後你在編譯時得到一組固定的子類,不能進一步擴展。具有私有構造函數的基類隨後用作到達這些內部類的路徑,但本身不可能在其他地方擴展和實現。