2014-12-08 72 views
0

我試圖調用Java類上沒有參數的方法,但是當我這樣做時,我得到了反射警告,說「引用field [methodName]不能解決」。在Clojure中調用沒有參數的Java實例方法

根據此Java關於Clojure文檔interop(http://clojure.org/java_interop),「實例成員表單適用於兩個領域和方法。」我怎麼能告訴它我想要一個方法?它似乎認爲,因爲我沒有通過參數,我想要一個領域。

+0

你的代碼是什麼樣的?如果你沒有將方法包裝在parens中,我相信如果你指定了foo.bar而不是foo.bar(),java會有類似的投訴。 – noisesmith 2014-12-08 03:01:36

回答

2

如果同時存在字段和方法,那麼(.member instance)表單將調用該方法(這更常見)。如果要強制訪問該字段,則(.-field instance)表單將僅檢索字段值。

如果您有一個不像您期望的那樣工作的示例,那麼查看代碼或錯誤會很有幫助。

在某些情況下,如果Clojure編譯器找不到該方法(通過未知的實例類或參數類型),該錯誤消息將指示它正在尋找一個字段,但這僅僅是它的順序的人造物評估選項。有時打開反射警告有助於更好地查明問題。

0

下面是一個例子。它創建一個Java類--StringBuilder,用一個字符串初始化。然後調用一個沒有參數 - reverse的方法,並通過調用toString方法將結果轉換爲一個String。

user=> (def sb (java.lang.StringBuilder. "Hello World")) 
;; #'user/sb 
user=> (.toString (.reverse sb)) 
;; "dlroW olleH" 
user=> (.toString (.reverse sb)) 
;; "Hello World" 
user=> 

甲StringBuilder對象是可變的,以便保持其狀態,其結果是,第二反向回滾的第一個。這不是很酷的Clojure,所以必須謹慎使用。

相關問題