2024 Clojure 调查问卷中分享您的想法!

欢迎!有关这个平台如何运作的更多信息,请参阅关于页面。

+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 的事情。在 clojure 中您应该使用 Long

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

`^Long` 是 `java.lang.Long` 类型,是装箱类型。使用 `^long` 将注解接口为非装箱 long 类型。
...