2017-09-12 72 views
0

以下のようにスカラ不変のマップを使用しました。スカラ不変のマップの動作を理解します

ヴァル・D = "4.55"

  1. これは正常に動作しています。その[文字列、AnyRef]オブジェクトが受け入れカントなぜ[文字列、任意]

    val properties = Map("title"->"title" , "value" -> d.toDouble) 
    
  2. カントにランタイムエラー

    val properties:Map[String,Object] = Map("title"->"title" , "value" -> d.toDouble) 
    

    、Objectにダブルから変換から変換

    val properties = Map("title"->"title" , "value" -> d) 
    
  3. ダブル?

  4. 正常に動作します。

    val properties:Map[String,Object] = Map("title"->"title" , "value" -> d.toDouble.asInstanceOf[Object]) 
    

不変地図の挙動の4つのシナリオを理解するカント。

+0

私はJavaの開発者ですが、私はあなたのことを推測しています(ScalaはおそらくJVM上で動作するためかもしれません)。Javaではジェネリックのために消去をタイプするので、タイプ情報はコンパイル時にのみ存在します。私はこれが全体像だとは思わないが、おそらくそれはこの行動に関連しているかもしれない。 –

+0

'valプロパティ[String、Object] = ...'は有効なScala構文ではありません –

+0

ええ、構文を編集しました。コロンを忘れました。 –

答えて

1

最も重要なもの:ScalaにはJavaと同じようにプリミティブ型はありません。

Scalaのダブルは、別名... クラス、クラスは、AnyValから継承され、それが自身のメソッド

ですが、Javaのオブジェクトは、すべての参照型のベースクラスであり

ここでは、Doubleを基本クラスとしてObjectを使用しています。私の意見で


ScalaのAnyRefは、Javaのオブジェクトに対応するタイプです。
ScalaのAnyValは、Javaのプリミティブタイプの対応する型です。

1

あなたはScalaのクラス階層をfroom見ることができるように...

Scala class hierarchy

... java.lang.ObjectのScalaの相当AnyRefで、タイプStringは、その家族の一部ですが、ScalaのDoubleAnyVal。コンパイラがこれらの2つの型を調整しなければならない場合、タイプAnyが見つかり、型変換なしでAnyRef/Object型に昇格することはできません(つまりキャスト)。

d.toDoubleの代わりにd.toSeqがあった場合、コンパイラはAnyRef/Objectにすぐに行きました。

関連する問題