clojure - java interop(找不到匹配的ctor)

时间:2016-06-21 19:42:21

标签: java class clojure interop

考虑以下几行Java代码:

final WebClient webClient = new WebClient()
final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net");

(摘自HTML Unit Project)的“入门”示例

怎么会被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) 

2 个答案:

答案 0 :(得分:4)

此:

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

相当于:

(new HtmlPage (. wc getPage "http://www.something.."))

等同于这个Java代码:

new HtmlPage(wc.getPage("http://www.something.."))

请省略额外的构造函数调用:

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

答案 1 :(得分:1)

我想补充一下Sam的答案,真正的问题是,编写Clojure代码的方式并未以与Java代码匹配的方式定义构造函数。

(ClassA.)

等效于

new ClassA();

任何参数的顺序相同

(ClassA. param1 param2)

等效于

new ClassA(param1, param2);

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

(.callMethodNoParams classA)

在Java中等同于

classA.callMethodNoParams();

另一个例子:

(.callMethod classA param1 param2)

在Java中等同于

 classA.callMethod(param1, param2);

另一个在调用方法时创建对象的示例:

classA.callMethod(param1, new ClassC(someParam));

在Java中等同于

(.callMethod classA param1 (ClassC. someParam))