2017-05-07 65 views
0

如何創建Any類型的變量? 爲什麼isInstanceOf [Int]打印爲真? 我聲明x是Any,不是Int。Scala - 如何將任何類型的變量存儲在內存中?

它是如何工作的?幕後發生了什麼?

val x = 4: Any // OK 

x.isInstanceOf[Int] // true 
x.isInstanceOf[String] // false 

[編輯]也許要改寫我的問題: 如何val x = 4: Any樣子的記憶是什麼? 一旦它被存儲在內存中作爲Any類型,我怎麼能後來說這個特殊的字節blob是Int,但不是說String

它是否與某種信息一起出現「原始」類型?例如,如果我輸入4AND LATER表示這是Any類型,它是否會將此原始類型的4存儲爲Int

+1

你的問題不清楚。什麼*確切*您的意思是「如何創建任何類型的變量」?你聲明一個類型爲「Any」的變量,就像你聲明一個任何其他類型的變量一樣,沒有什麼特別的「Any」,它只是一個類似任何其他類型的類型。事實上,你已經在你的代碼中做到了這一點! 「爲什麼isInstanceOf [Int]打印正確?」 - 因爲'4'是'Int'的一個實例。 –

+0

我改寫了我的問題。 – paroxyzm

回答

5

Scala語言被定義爲支持繼承多態的概念。換句話說,如果有一些類型T從U型繼承,然後類型T的任何值可以被分配到U型的一個變量:

class T extends U 
val x: U = new T // compiles 

同樣的事情AnyInt:Scala中,IntAny繼承,因此可以存儲一個整數的Any變量:

val x: Any = 4 // essentially the same as your example 

而且,所有的Scala就知道什麼類型的值是實際上存儲在一個變量運行的運行時間,不管的靜態的這個變量的類型。這對語言的許多功能很重要,特別是虛擬方法覆蓋,但它也允許您執行手動檢查和向下轉換,這是您的代碼執行的操作(檢查)。換句話說,isInstanceOf方法檢查存儲在變量中的值的類型,而不是在編譯時已知的靜態類型(這將毫無意義)。

+0

我喜歡在Scala中的'any'是抽象的。我一直覺得C#的對象應該是抽象的。 –