clojure-java互操作(未找到匹配的ctor)

clojure-java互操作(未找到匹配的ctor),java,class,clojure,interop,Java,Class,Clojure,Interop,考虑以下几行Java代码: final WebClient webClient = new WebClient() final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net"); (摘自的“入门”示例) 这将如何被采纳为Clojure 添加所需的依赖项后,我尝试了以下操作: (import '[com.gargoylesoftware.htmlunit.html HtmlPage]) (import '[c

考虑以下几行Java代码:

final WebClient webClient = new WebClient()
final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net");
(摘自的“入门”示例)

这将如何被采纳为Clojure

添加所需的依赖项后,我尝试了以下操作:

(import '[com.gargoylesoftware.htmlunit.html HtmlPage])
(import '[com.gargoylesoftware.htmlunit WebClient])

(let [wc (WebClient.)
      hp (HtmlPage. (.getPage wc "http://www.something.."))]
   ;;...)
但我得到了这个错误:

CompilerException java.lang.IllegalArgumentException: No matching ctor found f\
or class com.gargoylesoftware.htmlunit.html.HtmlPage, compiling:(*cider-repl l\
ocalhost*:30:16) 
有人知道为什么吗


编辑:

如注释中所述,调用HtmlPage的构造函数可能没有必要。但是,以下代码也会产生一个错误,尽管是另一个错误:

    (.getPage (WebClient.) "http://htmlunit.sourceforge.net")

IllegalArgumentException Cannot locate declared field class org.apache.http.im\
pl.client.HttpClientBuilder.dnsResolver  org.apache.commons.lang3.Validate.isT\
rue (Validate.java:155) 
这:

(HtmlPage.(.getPage-wc)http://www.something.."))
相当于:

(新的HtmlPage(.wc getPage)http://www.something.."))
这相当于以下Java代码:

final WebClient webClient = new WebClient()
final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net");
newhtmlpage(wc.getPage(“http://www.something.."))
只需省去额外的构造函数调用:

(.getPage-wc)http://www.something..")

我想补充Sam的回答,真正的问题是Clojure代码的编写方式没有以与Java代码匹配的方式定义构造函数

(ClassA.)
相当于

new ClassA();
new ClassA(param1, param2);
所有参数的顺序都相同

(ClassA. param1 param2)
相当于

new ClassA();
new ClassA(param1, param2);
类名后的点(.)创建新对象,名称调用方法前的点。您还需要调用该方法的对象。例如,假设classA是classA的一个对象,并且有方法callMethodNoParams()和callMethod(ClassB param1,ClassC param2)

在Java中相当于

classA.callMethodNoParams();
 classA.callMethod(param1, param2);
另一个例子:

(.callMethod classA param1 param2)
在Java中相当于

classA.callMethodNoParams();
 classA.callMethod(param1, param2);
调用方法时创建对象的另一个示例:

classA.callMethod(param1, new ClassC(someParam));
在Java中相当于

(.callMethod classA param1 (ClassC. someParam))

谢谢你的回答,不幸的是你的建议不起作用-我在与此相关的原始帖子中添加了一些内容。这个库还有一个非常古老的clojure包装:,“我还不能理解他们的互操作方法。@AntonHarald看起来和我在回答中给出的完全一样。看起来我现在可以解决它了,谢谢你的帮助!第二个错误似乎与第一个错误无关。不过,我只是在抓救命稻草;如果没有一个包含依赖项配置的应用程序,很难说发生了什么。