2016-12-31 24 views
2
scala> val a = Int 
a: Int.type = object scala.Int 

scala> val a = String 
<console>:11: error: object java.lang.String is not a value 
     val a = String 
      ^

Stringを値にするために、スカラがjava.lang.Stringの周りに薄いラッパーを作成しなかったのはなぜですか?主な型(String)の1つが式で使用できないか、関数に渡されたり、関数から返されたりしないときは、非常に制限的ではありませんか?文字列が値でないのはなぜですか?

+0

*主要な型(文字列)の1つが式で使用できない場合や関数から渡された/返されない場合には、それは非常に制限的ではありませんか?値に 'String'の束縛が伝えようとしているものがわからない –

+0

@YuvalItzchakov私は動的に型付けされた言語(例えば、実行時に何かの型を確認したいかもしれません)に慣れています。静的言語では、型を変数に格納するのは有用ではないと思います(コンパイル時に型が分かっているので)。つまり、「val a = Int」はスカラーで有効です。そのために少なくともいくつかの用途があるかもしれませんか? – max

+5

'val tpe = typeOf [String]'や 'val cls = classOf [String]'を使うことができます。 IntはInt型のコンパニオンオブジェクトなので、 'val a = Int'は有効です。 – adamwy

答えて

3

まあ... Scalaのclassにはコンパニオンオブジェクトが含まれています。

class Aのコンパニオンオブジェクトは、実際にはA.typeのインスタンスです。

そう...あなたは、

val i = Int 

何が得ることIntはまだ値ではないことに注意してくださいInt.type

のインスタンスであるclass Intcompanion object ...これですあなたが持っているものはIntではありません。また、Intのインスタンスでもありません。これはInt.typeのインスタンスです。

ただし、Stringは、Javaの世界に対応するjava.lang.Stringのエイリアスとして定義されているため、companion objectはありません。したがって、val割り当てはそれでは機能しません。

なぜStringはScalaでラップされていないのですか?これには多くの理由があります。しかし1つの主な理由は、その必要がないからです。

Scalaはオブジェクト階層でpureオブジェクトを持ち、同じルートから継承するようにしたいと考えましたAny。 Javaには、int,longなどの基本型があります。オブジェクトではありません。これにより、Intにラップする必要が生じました。

0

質問は、おそらくそのようなオブジェクトが存在しないにもかかわらず、彼らはコンパニオンオブジェクトのメンバーであるかのようにあなたがJavaの静的を選択することができる理由以下が提案する、タイプをreifyingについて思い違いをオンにしますが:

$ scala 
Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_111). 
Type in expressions for evaluation. Or try :help. 

scala> java.lang.System.currentTimeMillis 
res0: Long = 1483263161912 

scala> java.lang.System 
<console>:12: error: object java.lang.System is not a value 
     java.lang.System 
       ^

scala> java.lang.System.toString 
<console>:12: error: value toString is not a member of object System 
Note that System extends Any, not AnyRef. 
Such types can participate in value classes, but instances 
cannot appear in singleton types or in reference comparisons. 
     java.lang.System.toString 
         ^

scala> 
関連する問題