请在2024年Clojure调查!中分享您的想法。

欢迎!请参阅关于页面以了解有关此内容的一些信息。

0
协议
似乎当您对一个"[Ljava.lang.Object;"类型的协议进行扩展时,无法解析"[Ljava.lang.Object;"子类型。


(defprotocol Table
  (t [this]))

(extend-protocol Table
  (Class/forName "[Ljava.lang.Object;")
  (t [this] this))

(t (make-array java.lang.String 0))
=> IllegalArgumentException No implementation of method: :t of protocol: #'test-t/Table found for class: [Ljava.lang.String;  clojure.core/-cache-protocol-fn (core_deftype.clj:568)

(t (make-array java.lang.Object 0))
=> ["[Ljava.lang.Object;" 1512480936 "[Ljava.lang.Object;@5a26a0a8"]


然而,Java在Object[]上是协变的。


(instance? (Class/forName "[Ljava.lang.Object;") (make-array java.lang.String 0))
=> true



$ cat > Foo.java
public class Foo {
  public Object[] fooey;
  public Foo() {
    fooey = new String[10];
  }
}
$ javac Foo.java
$

2 答案

0

评论由:alexmiller发表

相关:CLJ-1381

0
参考:https://clojure.atlassian.net/browse/CLJ-2215 (由alex+import报告)
...