Clojure 创建新Java对象实例化错误
我试图在Clojure中创建一个新的SimpleLineKresolver。这是JavaDoc: 我的clojure代码是:Clojure 创建新Java对象实例化错误,clojure,Clojure,我试图在Clojure中创建一个新的SimpleLineKresolver。这是JavaDoc: 我的clojure代码是: (def lr (new io.prismic.SimpleLinkResolver)) 但在repl中,我得到以下错误: CompilerException java.lang.InstantiationException, compiling:(form-init460449823042827832.clj:1:1) 创建java.util.Date没有问题:
(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确实指出SimpleLineKresolver不受欢迎,因为接口LinkResolver()具有默认方法,因此可以直接实现。所以我试着说:
(def lr (new io.prismic.LinkResolver))
CompilerException java.lang.IllegalArgumentException: No matching ctor found for interface io.prismic.LinkResolver,
我得到了这个“no-ctor”错误-我猜这意味着编译器找不到构造函数
问题:
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"
注意:您需要键入hint返回值(和参数),因为.resolve()
是一个重载方法
另外,您通常会看到
(类)
点语法而不是(新类)
来实例化Java类。感谢您提供了非常翔实的答案。非常感谢!