我是Clojure的新手,我正在尝试为Clojure实现一个Java接口。特别是这段代码
import javax.print.*;
class Test {
public static void main (String [] args)
{
PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
System.out.println("Number of print services: " + printServices.length);
for (PrintService printer : printServices)
System.out.println("Printer: " + printer.getName());
}
}
PrintService
是一个接口,PrintServiceLookup
是一个constaructor类。我对如何使用reify和代理感到困惑。我的目标是在我的系统上安装已安装的打印机。
任何人都可以解释如何使用reify或代理?从文档中我明白我必须加载界面,然后加载我想要使用的方法,但我不能使它工作。
从我理解的Java角度来看,我必须从PrintServiceLookup.lookupPrintServices()
获取一个对象并从getName
接口应用PrintService
函数然后打印它。
我的尝试到现在为止
(defn print-serv []
(let [printS (proxy [PrintService PrintServiceLookup] []
(getName [])
(lookupPrintServices [])
)]
(.println (System/out) (.getName printSe))
)
)
我很确定这一切都是错误的,但我无法理解如何真正的知情和代理工作,如果有人能够更好地将它告诉我,我将不胜感激!
答案 0 :(得分:2)
您发布的Java代码没有实现接口。看起来你只是试图调用一个静态方法并迭代结果:
(let [printers (PrintServiceLookup/lookupPrintServices nil nil)]
(println "Number of print services:" (count printers))
(doseq [^PrintService p, printers]
(println (.getName p)))
doseq
循环也可以简单地写为:
(doseq [p printers]
...)
我刚刚提供了^PrintService
类型提示以便完整性。
另请注意,您不必撰写完整的(.println (System/out) ...)
。 Clojure有println
捷径。