Clojure 2024 状态调查!中分享您的想法。

欢迎!请参阅关于页面以获取更多关于如何使用此功能的信息。

+1 投票
协议

以下示例将导致运行时类转换异常。似乎无法将类型注解 ^long 添加到协议中,因为它将导致编译时错误或运行时错误。

(defprotocol my-protocol-1
    (my-func-1 [this value]))

(deftype my-type-1 [x]
    my-protocol-1
    (my-func-1 [this value]
        (* value 2)))

(def z1 (my-type-1. 123))

(println (my-func-1 z1 99)) ;; this works

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


(defprotocol my-protocol-2
    (my-func-2 [this ^long value]))  ;; only a type hit has been added

(deftype my-type-2 [x]
    my-protocol-2
    (my-func-2 [this value]
        (* value 2)))

(def z2 (my-type-2. 123))

(println (my-func-2 z2 456)) ;; will cause exception
                             ;; class user$eval180$fn__181$G__171__188 cannot be cast to class clojure.lang.IFn$OLO

2 个回答

+1 投票

如果您想使用原始类型,请使用 definterface。

0 投票

您不能在 clj 中使用 long
这是一个 cljs 问题。在 clj 中,您应该使用 Long

当您在 clj 中使用 long 时,它解析为 clojure.core/long,这是一个函数。然后它无法匹配类型

`^Long` 是 `java.lang.Long` 类型,属于封装类型。使用 `^long` 将为接口添加未封装的长整型注解。
...