2016-07-26 64 views
1

我試圖動態地列出列表的值 - 我不需要,但我很好奇這是什麼問題:Clojure:(double 0)vs(cast(class 0.0)0)

(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 

我猜測它與Double中的頂點D有關。爲什麼我不能在上面的代碼中試用cast

回答

5

這不僅僅是cast在Clojure中所做的 - 它不是Java類型的轉換,因爲這種類型轉換在動態而不是靜態類型的語言中沒有意義。事實上,幾乎沒有任何理由可以撥打cast;在Clojure編程的五年中,我當然沒有。看到documentation for cast:它總是返回完全的輸入,從來沒有其他的東西。它的唯一影響是如果輸入與您想要投射的類不匹配,則拋出異常。

+0

啊,我不知道'cast'沒有施展的東西。 :)你知道我將如何完成我的代碼的意圖,即使它在Clojure中有點奇怪嗎? –

+0

此外,錯誤消息肯定會使它聽起來像'cast'正在嘗試投射。 –

+0

@BobJarvis咦?這種情況下的表達毫無意義。 '(case(class「hello world」)0.0)'*也*返回0.0,因爲你只是評估'(class x)'副作用,拋棄它,然後無條件返回0.0。 – amalloy

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 
相關問題