簡體   English   中英

clojure-Java互操作(找不到匹配的ctor)

[英]clojure - java interop (No matching ctor found)

考慮以下幾行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) 

這個:

(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);

類名稱后的點(。)創建一個新對象,名稱前的點調用一個方法。 您還需要對象調用該方法。 例如,說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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM