可以在Scala中定義sealed
類,除非子類在同一個文件中發生,否則基本上都是final
。在Java中是否實施了密封類,如果是,如何實現?
看來,JVM不允許final
類字節碼和它的子類。
考慮到字節碼中沒有源文件的「概念」,這個限制是如何執行的?
因此,javac
如何防止Scala sealed
類在Java中被分類?
可以在Scala中定義sealed
類,除非子類在同一個文件中發生,否則基本上都是final
。在Java中是否實施了密封類,如果是,如何實現?
看來,JVM不允許final
類字節碼和它的子類。
考慮到字節碼中沒有源文件的「概念」,這個限制是如何執行的?
因此,javac
如何防止Scala sealed
類在Java中被分類?
這個限制是scalac在編譯時爲Scala源強制執行的。由此產生的二進制類定義沒有設置JVMs最終標誌,正如您現在可能已經猜到的那樣,當針對Scala二進制文件編譯Java源代碼時,javac不會強制執行密封的限制。
是否可以在Java/JVM端執行它(例如通過'sealed class'構造函數中的包檢查),即使它僅在運行時? – Adowrath 2017-05-07 10:28:49
如何使用私人構造函數爲要封閉的類,然後創建公共最終靜態內部類來擴展該類。然後你在編譯時得到一組固定的子類,不能進一步擴展。具有私有構造函數的基類隨後用作到達這些內部類的路徑,但本身不可能在其他地方擴展和實現。
所以,爲了澄清一下,你問是否有可能在JVM上運行Scala代碼中的密封類(不是**),在Java *語言中可能有類似於'密封'類)。對? – 2010-12-16 12:07:00
你的意思是「看來JVM不允許最終的類字節碼」?沒有字節碼標記類最終? – pedrofurla 2010-12-16 12:16:34
@pedrofurla:AFAIK JVM不允許在字節碼中標記爲「final」的類的子類?或者這個限制只在'javac'中執行? – soc 2010-12-16 12:24:36