2013-04-26 73 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

相关问题