协议中的暗示返回类型在Clojure中有任何影响吗?

协议中的暗示返回类型在Clojure中有任何影响吗?,clojure,Clojure,您可以在协议中提示返回类型 (defprotocol Individual (^Integer age [this])) 编译器将使您的方法符合以下要求: (defrecord person [] Individual (^String age [this] "one")) ; CompilerException java.lang.IllegalArgumentException: Mismatched return type: age, expected: java.lang

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

(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"
类型提示是否有任何效果



这是对返回类型提示进入协议函数
age
as标记的后续操作。从这里开始,标记用于本地类型推断。要在行动中遵守这一点:


-(.longValue(年龄(新人)))
ClassCastException java.lang.String不能转换为java.lang.Integer
net.bendlas.lintox/eval18038(表单-init4752901931682060526.clj:1)
;; longValue是整数方法,因此插入了直接强制转换

如果类型提示已被取消,或者如果调用的方法不在提示类型上,编译器将向反射器中插入(慢速)调用,而不是普通转换:


-(.其他方法(年龄(新人)))
IllegalArgumentException未找到匹配字段:类java.lang.String clojure.lang.Reflector.getInstanceField的otherMethod(Reflector.java:271)

类型提示放错了位置。应该像
(年龄^String[this]“one”)
。编译器没有使方法符合。混淆,但在方法名称上,它是defrecord中类型提示的正确位置(请参阅文档)。我不知道defprotocol中是否有正确的位置,因为非原始提示似乎被忽略了,原始提示似乎破坏了实现它们的能力。我已经删除了我的答案,充其量只是猜测。@A.Webb谢谢你的努力。我倾向于把这个问题作为一个路标来警告困惑的人,包括我自己。