是否有可能没有LET的类型提示?

时间:2013-02-15 07:19:27

标签: clojure

这是我的代码(例子):

(def foo (.java_method java_object))
(debug "result of method bar() on object foo: " (.bar foo))

我收到警告(foo在Java中的类型为FooType):

Reflection warning, example/test.clj:2 - call to bar can't be resolved

我可以使用此类提示删除警告:

(def foo (.java_method java_object))
(debug "result of method bar() on object foo: " (.bar ^FooType foo))

这很有效,但每次使用foo时我都必须这样做。另一种解决方案是使用let,但它会创建额外的缩进级别,我希望避免这种情况。是否可以做类似的事情:

(def foo (.java_method java_object))
(set-type foo FooType)
(debug "result of method bar() on object foo: " (.bar foo))

2 个答案:

答案 0 :(得分:1)

没有。要将类型提示等编译时元数据与命名值相关联,请使用let。

答案 1 :(得分:1)

您可以将类型提示与def相关联。

(def ^FooType foo (.java_method java_object))

UPDATE:

示例:

user=> (set! *warn-on-reflection* true)
true
user=> (import java.util.Hashtable)
java.util.Hashtable
user=> (def ^Hashtable table (Hashtable.))
#'user/table
user=> (.put table "one" 1)
nil
user=> (.put table "two" 2)
nil