Clojure :( double 0)vs(cast(class 0.0)0)

时间:2016-07-26 18:48:46

标签: clojure casting

我试图动态投射列表的值 - 我不需要,但我很好奇这里的问题是什么:

A

我猜它与(double 0) ; => 0.0 (class 0.0) ; => java.lang.Double (cast (class 0.0) 0) ; => ClassCastException Cannot cast java.lang.Long to ; java.lang.Double java.lang.Class.cast 中的资本D有关。为什么我不能Double我在上面的代码中尝试过的方式?

2 个答案:

答案 0 :(得分:5)

这不是cast在Clojure中的作用 - 它不是Java演员,因为这种演员在具有动态而非静态类型的语言中毫无意义。事实上,几乎从来没有理由打电话给cast;在Clojure编程的五年中,我当然没有。请参阅documentation for cast:它始终返回其输入,绝不返回任何其他内容。它的唯一作用是如果输入与你想要转换的类不匹配则抛出异常。

答案 1 :(得分:3)

在JVM上,我们有原始longdouble类型以及对象LongDouble类型。你正在处理对象(capial L,大写D),而不是基元。对象的层次结构如下:

|- Object
 |- Number
  |- Long
  |- Double

正如您所看到的,虽然它们都是Number,但Long不是Double,因此投射会失败。

要强制转换为Double,请使用double函数:

(class 0) ; => java.lang.Long

(class (double 0)) ; => java.lang.Double