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

在Clojure中使用genclass扩展Java类时如何调用超类?,java,clojure,Java,Clojure,我想从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 {

我想从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)
这是调用超级类方法的正确方法吗

更新:明白了。我们创建了一个不同的方法,它将内部调用基类方法。

注意:链接的答案不是这样说的。

这个问题已经被解决了

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

例如,类似这样的内容:

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

您的代码与副本中的答案不符。您可以使用
(.pgreet(BaseClass.))
而不是(.pgreet this)`。这是一个巨大的差异。什么是
this
arg?它不是类
基类
的对象吗?如果没有,
(defn greet[this](.pgreet this))
如何调用
greet
?对于
this
arg,我应该传递什么?不,如果您遵循另一个问题中给出的答案,
this
将是类
BaseClass
的子类的对象。
BaseClass
没有
pgreet
方法——是
gen class
ed上有
pgreet
方法。可能与我得到的ClassNotFoundException重复:subclass.core。你有
subclass.core
命名空间吗?您可能需要将
:aot
条目添加到
项目.clj
以简化此操作。我添加了
:aot[subclass.core]
,现在
lein repl
无法找到
基类。我有
:java源路径[“src/java”]
。它给出了
ClassNotFoundException:java.lang.Baseclass
。不管怎么说,谢谢你的回答。从另一篇文章来看,这是因为裸体课。将java文件放在包中可以很好地工作。