有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Clojure中使用genclass扩展Java类时如何调用超类?

我想从Clojure调用超类中的一个方法。我正在使用:gen-class扩展一个Java类

(ns subclass.core
    (:gen-class
     :extends Baseclass))

(defn greet [] 
    "Hello from core")  ; how to call super.greet()?

(defn -main [& args]
    (greet))

Java基类

public class Baseclass {
    public String greet() {
        return "Hello from Baseclass";
    }
}

编辑:作为我尝试的链接示例

 (ns subclass.core
    (:gen-class
     :extends Baseclass
     :exposes-methods {greet pgreet})
    (:import Baseclass))

(defn greet []
    (.pgreet (Baseclass.)))

(defn -main [& args])

但是当我打电话(打招呼)时,我发现了错误

IllegalArgumentException No matching field found: pgreet for class Baseclass  clojure.lang.Reflector.getInstanceField (Reflector.java:271)

这是调用超级类方法的正确方法吗

更新:明白了。我们创建了一个不同的方法,它将内部调用基类方法。 https://en.wikibooks.org/wiki/Clojure_Programming/Examples/API_Examples/Java_Interaction#genclass
注:链接的答案不是这么说的


共 (1) 个答案

  1. # 1 楼答案

    这个问题已经被讨论过了

    您的示例失败,因为greet函数尝试在BaseClass的实例上调用pgreet方法。您需要创建gen-classed类的实例

    例如,类似这样的内容:

    (ns subclass.core
      (:gen-class
       :extends Baseclass
       :exposes-methods {greet pgreet})
      (:import Baseclass))
    
    ;; You need to define a function for the overridden method
    (defn greet- [this]
      (. this (pgreet)))
    
    (defn greet []
      ;; You need to use the *gen-class*ed class, not BaseClass
      (. (new subclass.core) (greet))))