esp*_*eed 2 clojure clojure-java-interop
我正在获取IllegalArgumentException: Can't find matching method: render, leave off hints for auto match,但是我需要类型提示来重载该方法。我想念什么...?
(defprotocol LinkRendererProtocol
(render
[this node]
[this node text]
[this node url title text]
))
(deftype LinkRenderer [handlers]
LinkRendererProtocol
(render [this ^AutoLinkNode node]
(rendering :auto-link handlers node))
(render [this ^ExpLinkNode node text]
(rendering :exp-link handlers node text))
(render [this ^ExpImageNode node text]
(rendering :exp-image-link handlers node text))
(render [this ^MailLinkNode node]
(rendering :mail-link handlers node))
(render [this ^RefLinkNode node url title text]
(rendering :ref-link handlers node url title text))
(render [this ^RefImageNode node url title alt]
(rendering :ref-image handlers node url title alt))
(render [this ^WikiLinkNode node]
(rendering :wiki-link handlers node)))
(defn link-renderer
[handlers]
(LinkRenderer. (merge default-handlers handlers)))
Run Code Online (Sandbox Code Playgroud)
协议方法不能使用类型提示。即使它们支持类型提示,您也可能需要将它们放在协议方法声明本身中。
如果您想让方法重载或只是拥有非的参数类型Object,则需要将其声明为接口方法并实现该接口。您可以从Clojure(请参阅definterface和gen-interface)中执行此操作,也可以.java在项目中仅包含一个声明该接口的文件。(不用说,以这种方式声明的方法必须使用互操作语法来调用。)
请注意,重载的方法是静态解决的,因此您不能使用方法重载来代替链式instance?检查。
| 归档时间: |
|
| 查看次数: |
615 次 |
| 最近记录: |