我正在尝试在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”错误 - 我猜这意味着编译器无法找到构造函数?
问题:
由于
答案 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类。