在Clojure中使用genclass扩展Java类时如何调用超类?
我想从Clojure调用超类中的一个方法。我正在使用在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 {
: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文件放在包中可以很好地工作。