你能在clojure defrecord中指定方法的返回类型吗?

时间:2014-04-09 06:39:29

标签: methods types clojure

我已经创建了一个application-info接口和一个类但是当我查看生成的类时,所有方法的返回类型都是Object,我可以将返回类型更改为String吗?文档说使用defrecord可以进行类型提示,但是没有给出一个例子,我能找到的唯一例子是类型提示字段和方法参数。

的src / COM / vnetpublishing.clj

(ns com.vnetpublishing)

(defprotocol ApplicationInfo
  (author [obj])
  (author-email [obj])
  (copyright [obj])
  (app-name [obj])
  (version [obj])
)

的src / Physics.clj

(ns Physics)

(defrecord info [] com.vnetpublishing.ApplicationInfo
  (author [this] "Ralph Ritoch")
  (author-email [this] "Ralph Ritoch <root@localhost>")
  (copyright [this] "Copyright \u00A9 2014 Ralph Ritoch. All rights reserved.")
  (app-name [this] "Physics")
  (version [this] "0.0.1-alpha")
)

2 个答案:

答案 0 :(得分:6)

查看definterface宏。 与defprotocol不同,definterface宏提供了一种为方法编写返回类型提示的方法。

Alan Malloy很好地解释了这一点here

“协议是供Clojure函数使用的,而不是 应该是静态类型的;接口是供消费的 Java类,需要静态输入。“

然后您可以像:

一样使用它
(definterface Test
 (^void returnsVoid [])
 (^int returnsInt [])
 (^long returnsLong [])                                                             
 (^String returnsString [])
 (^java.util.HashMap returnsJavaUtilHashMap []))

答案 1 :(得分:1)

您可以输入提示协议...

(defprotocol ApplicationInfo
  (author ^String [obj])
  ; ...
  )

但是我告诉这个类型提示可能会被忽略(参见this后续问题)。