2010-09-06 25 views
14

Tôi muốn bỏ một đối tượng Java đinh tán (được gán với let *) cho một loại lớp Java khác. Điều này có thể và nếu vậy thì làm thế nào tôi có thể làm điều này?Làm thế nào tôi có thể bỏ một lớp Java trong Clojure?

Cập nhật: Vì tôi đã đăng câu hỏi này, tôi đã nhận ra rằng tôi không cần phải bỏ qua Clojure vì nó không có khái niệm về giao diện và giống như gõ vịt của Ruby. Tôi chỉ cần để cast nếu tôi cần phải biết rằng một đối tượng chắc chắn là của một loại nhất định, trong trường hợp này tôi nhận được một ClassCastException

+0

Bạn có thể đăng một số mã mẫu để xem bạn muốn đạt được điều gì không? –

+0

Vì tôi đã đăng bài này, tôi nhận ra rằng tôi không cần phải bỏ qua trừ khi tôi thực sự cần biết loại đối tượng – Zubair

Trả lời

15

Có một chức năng cast để làm điều đó trong clojure.core:

user> (doc cast) 
------------------------- 
clojure.core/cast 
([c x]) 
    Throws a ClassCastException if x is not a c, else returns x. 

Bằng theo cách này, bạn không nên sử dụng trực tiếp let* - nó chỉ là chi tiết triển khai sau let (đó là những gì nên được sử dụng trong mã người dùng).

9

Lưu ý rằng hàm cast thực sự chỉ là một kiểu xác nhận cụ thể. Không cần phải thực sự đúc trong clojure. Nếu bạn đang cố tránh phản xạ, thì chỉ cần nhập gợi ý:

user=> (set! *warn-on-reflection* true) 
true 
user=> (.toCharArray "foo") ; no reflection needed 
#<char[] [[email protected]> 
user=> (defn bar [x]   ; reflection used 
     (.toCharArray x)) 
Reflection warning, NO_SOURCE_PATH:17 - reference to field toCharArray can't be resolved. 
#'user/bar 
user=> (bar "foo")   ; but it still works, no casts needed! 
#<char[] [[email protected]> 
user=> (defn bar [^String x] ; avoid the reflection with type-hint 
     (.toCharArray x)) 
#'user/bar 
user=> (bar "foo") 
#<char[] [[email protected]> 
+0

Thực ra quyền của bạn, tôi đã nhận ra khá sớm vì không có khái niệm về giao diện mà việc truyền là không cần thiết – Zubair

Các vấn đề liên quan