【问题标题】:Clojure deftype with Type Hints?: Can't find matching method, leave off hints for auto matchClojure deftype with Type Hints?:找不到匹配方法,留下自动匹配的提示
【发布时间】:2014-05-20 22:30:59
【问题描述】:

我得到了一个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)))     

【问题讨论】:

  • 我找到了this。也许会有所帮助。

标签: clojure clojure-java-interop


【解决方案1】:

协议方法不能进行类型提示。即使它们支持类型提示,您也可能需要将它们放在协议方法声明本身中。

如果您希望您的方法被重载或只是具有Object 以外的参数类型,您需要将其声明为接口方法并实现该接口。您可以从 Clojure 中执行此操作(请参阅 definterfacegen-interface),或者只需在项目中包含一个声明该接口的 .java 文件。 (不用说,以这种方式声明的方法必须使用互操作语法来调用。)

请注意,重载方法是静态解析的,因此您不能使用方法重载来替代链式instance? 检查。

【讨论】:

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