Clojure中定义返回自身接口类型的方法报错怎么解决?
解决Clojure接口返回自身类型的ClassNotFoundException问题
问题出在类型提示的解析逻辑上:Clojure默认会把不带命名空间的类型名(比如Expression)当成java.lang包下的类去查找,但你用definterface定义的Expression属于当前代码的命名空间,并非java.lang里的类,所以会报找不到的错误。提前declare没用是因为declare针对的是Clojure变量,管不到definterface生成的Java类。
你可以用以下几种方法修正:
方法1:用引号包裹类型名
在返回类型前加单引号,告诉Clojure在当前命名空间查找这个类:
(definterface Expression (^Number evaluate [data]) (^'Expression diff [diffVar]))
方法2:使用全限定类名
如果知道当前命名空间,直接写完整的类路径,比如你的命名空间是my.calc,就这么写:
(definterface Expression (^Number evaluate [data]) (^my.calc.Expression diff [diffVar]))
方法3:用命名空间限定符(同命名空间下)
在同一个命名空间里,可以用::前缀来引用当前命名空间的类:
(definterface Expression (^Number evaluate [data]) (^::Expression diff [diffVar]))
内容的提问来源于stack exchange,提问作者Stepan
相关产品推荐
相关产品推荐

