構文(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コンパイラだけでコンパイル時のコンテキストからのショートカットを提供します(これは実行時にClass.forName
のようなJVMでは利用できません)... OK ... Clojureではもちろん、常に次のように定義することができます:(def Inner Outer$Inner)
...または(def Tom Outer$Inner)
または(def Harry Outer$Inner)
または何でも...もしあなたがそれがより好きなら。
'import'関数や':import'キーワードでFileChannelをインポートする場合、 'FileChannel $ MapMode'をインポートしていることも忘れないでください。 –
@TerjeDahlありがとうございます。私はこれを含めるためにあなたの質問を編集すべきだと思う、Hamza Yerlikaya。 – Joe