Cú pháp (FileChannel/MapMode)
là một việc đơn giản hóa và chỉ nhằm mục đích cho các lĩnh vực và phương pháp tĩnh (đối với các lĩnh vực, thậm chí bạn có thể bỏ qua các dấu ngoặc đơn)! Ngoài ra các hình thức .
và ..
là dành cho các trường/phương thức nhưng KHÔNG cho các lớp lồng nhau/bên trong!
Đối với JVM, một lớp bên trong Outer.Inner
chỉ là một lớp có tên Outer$Inner
(và trình biên dịch tạo một tệp Outer$Inner.class
cho việc này). Trình biên dịch Java cho phép bạn tham khảo nó bằng Outer.Inner
. Bạn cũng có thể định nghĩa một lớp không phải là bên trong có tên là Outer$Inner
mà trình biên dịch cho phép bạn tham chiếu là Outer$Inner
. Bạn không thể xác định cả hai cùng một lúc, vì cả hai đều có tên lớp là Outer$Inner
(và .class
tệp có tên Outer$Inner.class
, vì vậy đây sẽ là tên lớp trùng lặp!)
Khi sử dụng phản ánh - ví dụ: với Class.forName()
- (thường để giới thiệu một số năng động), bạn không thể bỏ qua tên gói của một lớp đã nhập và bạn phải sử dụng tên lớp thực với ký hiệu $
thay vì dấu chấm.
Có lẽ vì bản chất động, Clojure có cùng cách tiếp cận, vì vậy bạn cần sử dụng biểu mẫu my.package.Outer$Inner
nếu lớp học ở my.package
- ngay cả khi bạn đã nhập lớp ngoài! Để tránh tên gói, bạn rõ ràng có thể nhập các lớp bên trong my.package.Outer$Inner
và sau đó đề cập đến nó như Outer$Inner
(tên lớp thực sự của nó!) Nhưng bạn sẽ không giảm này để Inner
bằng cách chỉ cần nhập nó:
Inner
không có ý nghĩa để JVM, chỉ Java-Compiler cung cấp cho bạn lối tắt này từ ngữ cảnh biên dịch thời gian (không có sẵn cho JVM và các phương thức như Class.forName
khi chạy!) ... OK, trong Clojure bạn có thể, dĩ nhiên, luôn định nghĩa: (def Inner Outer$Inner)
... hoặc (def Tom Outer$Inner)
hoặc (def Harry Outer$Inner)
hoặc bất cứ điều gì ... nếu bạn thích điều đó tốt hơn.
Nguồn
2012-06-04 14:08:10
Đừng quên rằng nếu bạn đang nhập FileChannel với chức năng 'import' hoặc bằng từ khóa': import', bạn cũng phải xác định rằng bạn đang nhập 'FileChannel $ MapMode' –
Cảm ơn bạn @TerjeDahl. Tôi nghĩ bạn nên chỉnh sửa câu hỏi của bạn để bao gồm điều này, Hamza Yerlikaya. – Joe