clojure - java 互操作(未找到匹配的构造函数)
clojure - java interop (No matching ctor found)
考虑以下 Java 代码行:
final WebClient webClient = new WebClient()
final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net");
(取自'Getting Started'例子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)
这个:
(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..")
我想补充 Sam 的回答,真正的问题是您的 Clojure 代码编写方式没有以与您的 Java 代码匹配的方式定义构造函数。
(ClassA.)
等同于
new ClassA();
所有参数顺序相同
(ClassA. param1 param2)
等同于
new ClassA(param1, param2);
class 名称后的点 (.) 创建新对象,名称前的点调用方法。您也需要调用该方法的对象。例如说 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))
考虑以下 Java 代码行:
final WebClient webClient = new WebClient()
final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net");
(取自'Getting Started'例子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)
这个:
(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..")
我想补充 Sam 的回答,真正的问题是您的 Clojure 代码编写方式没有以与您的 Java 代码匹配的方式定义构造函数。
(ClassA.)
等同于
new ClassA();
所有参数顺序相同
(ClassA. param1 param2)
等同于
new ClassA(param1, param2);
class 名称后的点 (.) 创建新对象,名称前的点调用方法。您也需要调用该方法的对象。例如说 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))