2013-04-26 42 views
0

我是clojure的新手,我的問題很簡單,但是偶然發現我。
我想class實例化一個類弄,看起來像:我怎樣才能實例化某些類的新實例,因爲我已經擁有該類的對象?

(new (class an-object)) 

剛剛獲得通過實例初始化無關。

例如,如果an-object是一個向量:

(new (class [1 2 3])) 

repl運行這一點,但只得到該錯誤消息:

CompilerException java.lang.IllegalArgumentException異常:無法 決心classname:(class []),compiling :(NO_SOURCE_PATH:1)

+1

目前尚不清楚你想做什麼。實例化一些類,當你有'Class [..]'對象或什麼? – 2013-04-26 16:49:49

+1

@ om-nom-nom是的,假設我有一個對象並且想實例化對象的類。 – 2013-04-26 16:55:48

+0

投票人:Clojure開發人員並不總是擁有Java背景,所以這個問題的答案可能並不明顯。 – noahlz 2013-04-26 18:06:49

回答

2

Un因爲它涵蓋了所有的Java,所以你將不得不遵守Java反射的限制。

PersistentVectordoesn't have a default constructor,所以(new (class [1 2 3]))將永遠不會工作。您需要檢查可用的構造函數和靜態方法並使用它們。另外,這裏有一個函數(不是宏),它適用於零參數構造函數的類,你試圖做的一種類型(好吧,defn是一個宏,所以`和〜工作,但那是另一個故事):

(defn new-instance [obj] (let [clazz (class obj)] (eval `(new ~clazz)))) 

=> (new-instance "1224") 
"" 
=> (new-instance (new java.util.HashMap)) 
{} 
+0

我發現公共靜態方法'create'並運行'(clojure.lang.PersistentVector/create 1)',只能得到錯誤信息:IllegalArgumentException找不到匹配的方法:create – 2013-04-26 18:21:16

+0

Clojure對匹配參數非常非常嚴格。沒有簽名'創建(長1)',所以它不起作用。這確實有效:'(clojure.lang.PersistentVector/create(list 1))' – noahlz 2013-04-26 18:24:48

相關問題