解决Clojure中重载的float / double方法变体

时间:2015-10-27 23:04:51

标签: types clojure overloading

重载

java.lang.Math.scalb以接受double或float值作为第一个参数。我想称之为双变量,但我正在从一个长期的变换中转换。我发现正确解析的唯一方法是强制转换为double,然后调用java.lang.Double构造函数。是否有一种不那么混乱的方式呢?

user> (Math/scalb 21 -63)
IllegalArgumentException No matching method found: scalb  clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:80)

user> (Math/scalb (double 21) -63)
CompilerException java.lang.IllegalArgumentException: More than one matching method found: scalb, compiling:(NO_SOURCE_PATH:1:1) 

user> (Math/scalb (Double. 21) -63)
IllegalArgumentException No matching ctor found for class java.lang.Double  clojure.lang.Reflector.invokeConstructor (Reflector.java:183)

user> (Math/scalb (Double. (double 21)) -63)
2.2768245622195593E-18

1 个答案:

答案 0 :(得分:2)

你也需要转换第二个参数:它是一个int参数,但你的数字是长的。显然,编译器可以在某些情况下(例如这个)解决它,但是一旦你开始提供类型提示,你就可以完成消除歧义。

user> (Math/scalb (double 21) (int -63))
2.2768245622195593E-18