【问题标题】:Unable to call an instance method from Clojure.无法从 Clojure 调用实例方法。
【发布时间】:2013-02-12 18:01:14
【问题描述】:

我对 Java 和 clojure 完全陌生。但是凭借以前在 common lisp 方面的经验,我想我会尝试一下 clojure。我无法弄清楚一些非常基本的事情。

这是实际的 Java 代码。

import syntaxtree.*;
import visitor.*;

public class Main {
    public static void main(String [] args) {
    try {
        Node root = new MicroJavaParser(System.in).Goal();
        System.out.println("Program parsed successfully");
    }
    catch (ParseException e) {
        System.out.println(e.toString());
    }
    }
} 

当我运行这段代码时,结果符合预期。

└──╼ java Main < ../input/Factorial.java 
Program parsed successfully

在 Clojure 中我试过这个:

(ns clj-assign2.core)

(defn -main
  []
  (def root
    (.Goal
     (MicroJavaParser. (. System in))))
  (println "Successfully parsed"))

但是当这段代码运行时,会引发以下异常:

└──╼ lein run < ../assign2/input/Factorial.java 
Exception in thread "main" java.lang.IllegalArgumentException: No matching field found: Goal for class MicroJavaParser
    at clojure.lang.Reflector.getInstanceField(Reflector.java:271)
    at clojure.lang.Reflector.invokeNoArgInstanceMember(Reflector.java:300)
    at clj_assign2.core$_main.invoke(core.clj:7)
< --- snipped --- >

我在这里做错了什么?

【问题讨论】:

  • Goal 方法的签名是什么?
  • Goal 方法的可见性如何?
  • 从您发布的内容中无法判断。也许,目标是可变的,这可能会导致这种情况。尝试使用反射打印出 MicroJavaParser 中的所有方法,尝试打印出 getClass 的输出。或者尝试让它在 java.lang 中的类上工作,以便其他人可以尝试您的代码。顺便说一句,像这样在 defn 中使用 def 通常不是一个好主意!
  • 错在我头上。我没有解析器的源代码。我没有意识到调用new MicroJavaParser(System.in).Goal() 中的Goal() 函数实际上是静态的。好吧,Clojure 在这里做得更好,你总是知道从语法中调用的类型。

标签: java clojure leiningen clojure-java-interop


【解决方案1】:

也许您的 clojure 程序中缺少导入语句?

【讨论】:

    猜你喜欢
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    相关资源
    最近更新 更多