語法(FileChannel/MapMode)
是簡化的,只適用於靜態字段和方法(場,你甚至可以省略括號)!此外,.
和..
表單適用於字段/方法,但不適用於嵌套/內部類!
對於JVM,內部類Outer.Inner
只是一個名爲Outer$Inner
的類(並且編譯器爲此創建了一個文件Outer$Inner.class
)。 Java編譯器允許您通過Outer.Inner
來引用它。您還可以定義一個名爲Outer$Inner
的非內部類,編譯器允許您將其引用爲Outer$Inner
。你不能在同一時間同時定義,但是,因爲這兩個將有Outer$Inner
類名(命名爲Outer$Inner.class
和.class
文件,因此這將是一個重複的類名!)
當使用反射 - 例如與Class.forName()
- (通常引入一些動態性),您不能省略導入類的包名稱,您必須使用帶有$
符號的真實類名稱而不是點。
Clojure可能採用相同的方法,所以如果該類在my.package
中,即使您已經導入了外部類,您也需要使用my.package.Outer$Inner
這種形式!爲了避免包的名稱,你可以明確地導入內部類my.package.Outer$Inner
,然後把它稱爲Outer$Inner
(其真正的類名!),但你不會只將其導入這個減少Inner
:
Inner
沒有意義JVM,只是Java編譯器爲您提供了編譯時上下文的快捷方式(在運行時不可用於JVM和方法,如Class.forName
!)...在Clojure中,您當然可以始終定義:(def Inner Outer$Inner)
...或(def Tom Outer$Inner)
或(def Harry Outer$Inner)
或其他...如果你更喜歡那個。
不要忘記,如果您正在使用'import'函數或':import'關鍵字導入FileChannel,則還必須指定您正在導入'FileChannel $ MapMode' –
謝謝@TerjeDahl。我認爲你應該編輯你的問題,包括這個,Hamza Yerlikaya。 – Joe