在Clojure中,提示协议中的返回类型是否有效?

您可以在协议中提示返回类型

(defprotocol Individual
  (^Integer age [this]))

编译器会使你的方法符合:

(defrecord person []
  Individual
  (^String age [this] "one"))

; CompilerException java.lang.IllegalArgumentException: Mismatched return type: age, expected: java.lang.Object, had: java.lang.String, ...

但是你不必遵守类型提示:

(defrecord person []
  Individual
  (age [this] "one"))

(age (new person))
; "one"

类型提示是否有效?


这是一个后续能否指定clojure defrecord中方法的返回类型?


返回类型提示以协议功能age为标签。 从那里,标签用于本地类型推断。 在行动中观察这一点:

- (.longValue (age (new person))) ClassCastException java.lang.String cannot be cast to java.lang.Integer net.bendlas.lintox/eval18038 (form-init4752901931682060526.clj:1) ;; longValue is a method of Integer, so a direct cast has been inserted

如果类型提示已经关闭,或者如果您调用的方法不是提示类型,则编译器会将(缓慢)调用插入到反射器中,而不是简单转换:

- (.otherMethod (age (new person))) IllegalArgumentException No matching field found: otherMethod for class java.lang.String clojure.lang.Reflector.getInstanceField (Reflector.java:271)

链接地址: http://www.djcxy.com/p/19859.html

上一篇: Does hinting return types in protocols have any effect within Clojure?

下一篇: SBT: external config file with values accessible in build.sbt