2017-05-07 7 views
0

Any型の変数をどのように作成できますか? なぜ、isInstanceOf [Int]はtrueを出力しますか? xをIntではなくAnyにすると宣言しました。Scala - Any型の変数はどのようにメモリに格納されていますか?

どのように動作しますか?舞台裏で何が起こっていますか?

val x = 4: Any // OK 

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

は、[EDIT]たぶん私の質問を言い換えるする: はどのようval x = 4: Anyがメモリに見えますか?それはAnyタイプとしてメモリに格納された後 はまた、どのように私は後でバイトのこの特定のブロブがIntであることを言うが、Stringを言うことができませんか?

それは「オリジナル」タイプだったかの情報のいくつかの種類と一緒に付属していますか?ここで例えば、私は4を入力し、後で場合、それはIntとして4のこの元の型を格納します、これはAnyタイプであることを特徴としますか?

+1

あなたの質問は不明です。 「Any型の変数をどのように作成することができますか?」ということはどういう意味ですか?他の型の変数を宣言するのと同じように、変数に 'Any'型を宣言します。' Any'に特別なものはありません。他の型と同じ型です。実際には、あなたはすでにあなたのコードでそれを行いました! "なぜisInstanceOf [Int] print true?" - '4'は' Int'のインスタンスです。 –

+0

私の質問に言い換えました。 – paroxyzm

答えて

5

Scalaの言語は、継承ポリモーフィズムの概念をサポートするために定義されています。 AnyInt

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

同じこと:すなわち、タイプUから継承いくつかのタイプTが存在する場合には、型Tの任意の値は、タイプUの変数に割り当てることができるスカラで、Intかかわらず、また

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

、Scalaは実際が変数に格納された値の種類知っている上で動作するランタイムの全て、:従ってAny変数の整数を格納することが可能である、Anyから継承静的この変数の型。これは、言語の多くの機能、特に仮想メソッドのオーバーライドにとって重要ですが、コードが実行する手動チェックやダウンキャスト(チェック)も可能です。換言すれば、isInstanceOf方法は変数に格納された値のランタイムタイプをチェックし、そうでないと(全く無意味であろう)コンパイル時に知られているスタティック型。

+0

私はScalaでどのように 'any'が抽象であるのが好きです。私はいつもC#のオブジェクトが抽象的であるべきであると考えてきました。 –

関連する問題