创建新的Java对象实例化错误

时间:2018-03-17 10:37:57

标签: clojure

我正在尝试在Clojure中创建一个新的SimpleLinkResolver。这是JavaDoc:

http://prismicio.github.io/java-kit/io/prismic/SimpleLinkResolver.html

我的clojure代码是:

(def lr (new io.prismic.SimpleLinkResolver))

但是在repl我收到以下错误:

CompilerException java.lang.InstantiationException, compiling:(form-init460449823042827832.clj:1:1)

创建java.util.Date没问题:

(def d (new java.util.Date))
=> #'prismic-clojure.core/d
d
=> #inst"2018-03-17T10:30:36.016-00:00"

上面的JavaDoc确实说不推荐使用SimpleLinkResolver,因为接口LinkResolver(http://prismicio.github.io/java-kit/io/prismic/LinkResolver.html)具有默认方法,因此可以直接实现。所以我给了这个:

(def lr (new io.prismic.LinkResolver))
CompilerException java.lang.IllegalArgumentException: No matching ctor found for interface io.prismic.LinkResolver,

我得到这个“没有ctor”错误 - 我猜这意味着编译器无法找到构造函数?

问题:

  1. 为什么第一次产生InstantiationException?
  2. 不熟悉Java-8默认方法,如何使用默认方法创建新的LinkResolver?
  3. 由于

1 个答案:

答案 0 :(得分:3)

  

为什么第一次产生InstantiationException?

您无法实例化抽象类:

public abstract class SimpleLinkResolver
  

不熟悉Java-8默认方法,如何使用默认方法创建新的LinkResolver?

您需要实施LinkResolver界面,这可以使用Clojure reify完成:

(def resolver
  (reify LinkResolver
    (^String resolve [this ^Fragment$DocumentLink link]
      "a string"))) ;; put actual impl. here
(.resolve resolver nil)
;; => "a string"

请注意,您需要键入提示返回值(和参数),因为.resolve()是一个重载方法。

此外,您通常会看到(Class.)点语法而不是(new Class)来实例化Java类。