我有时会编写java方法,特别是对于原语/数组操作,我总是不知道如何在Clojure 1.8下使用类型提示。我看到了一些线索,但考虑到它们已经在两年多前发布,它们(可能?)过时了。
我将给出一个基本的例子来说明我的观点(我知道这个例子有点无意义)。在这里,我想总结两个double
并返回double
。
这是一个Java方法:
public static double add (double a, double b) {
return a + b;
}
然后我想要一个Clojure包装器:
版本1
(defn d+ ^double
[^double a ^double b]
(Doubles/add a b))
第2版
(defn d+ ^double
[^double a ^double b]
(Doubles/add ^double a ^double b))
第3版
(defn d+ ^double
[^double a ^double b]
(Doubles/add (double a) (double b)))
我不知道在何处放置类型提示以及如何放置它们。我的印象是(double x)
效率较低,因为它是一个函数(也许我错了?)。
那么在身体功能或外部提供提示之间有什么区别?
或者这些提示可能没有必要,因为Java类中只有一个方法? 我没有看到逻辑,所以一般我使用版本1或3(更多更好?)。
请注意,对于此示例,Clojure +总是更快
答案 0 :(得分:3)
版本1是正确的。它将发出以下字节代码:
public final class compile_inspect$d_PLUS_ extends AFunction implements DDD {
public compile_inspect$d_PLUS_() {
}
public static double invokeStatic(double a, double var2) {
return Primitives.add(a, var2);
}
public Object invoke(Object var1, Object var2) {
return new Double(invokeStatic(RT.uncheckedDoubleCast((Number)var1), RT.uncheckedDoubleCast((Number)var2)));
}
public final double invokePrim(double var1, double var3) {
return invokeStatic(var1, var3);
}
}
Primitives.add
就像您的Doubles/add
函数一样。
如果你想要表演并避免拳击,你应该设置:
(set! *unchecked-math* :warn-on-boxed)
同时浏览Java interop reference(CTRL + F"原语")也会有所帮助。