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事情。在clj中,您应该使用Long

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

`^Long` 是 `java.lang.Long` 类,属于装箱类型。使用 `^long` 将会用非装箱的长整型对接口进行注解。
...