【问题标题】:clojure - java interop (No matching ctor found)clojure - java interop(找不到匹配的ctor)
【发布时间】:2016-06-21 19:42:21
【问题描述】:

考虑以下 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) 

【问题讨论】:

  • 第二个错误似乎与第一个错误无关。不过,我只是在这里抓住稻草;如果没有包含您的依赖配置的MCVE,很难说发生了什么。

标签: java class clojure interop


【解决方案1】:

这个:

(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..")

【讨论】:

  • 感谢您的回答,不幸的是您的提议不起作用 - 我在与此相关的原始帖子中添加了一些内容。
  • 这个库还有一个 - 非常古老 - clojure 包装器:github.com/hippiehunter/clj-htmlunit,我还不知道他们的互操作方法。
  • @AntonHarald Their call to getPage 看起来和我在回答中给出的完全一样。
  • 看来我现在可以解决了,谢谢你的帮助!是一些版本混淆造成的。
【解决方案2】:

我想补充 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))

【讨论】:

    猜你喜欢
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多