2016-12-05 6 views
2

私はこのような宣言がある場合:右側のスカラ型注釈? Scalaで

val i: Float = 5 

これは、この行と同様です:

val i = 5: Float 

最近、このようなタイプの注釈が右側に表示されました。スペックで見つけられなかったため、その使用法がわかりました。

+0

最初にフロートとして値を定義すると仮定します。 2番目のケースでは、5の値をFloatで値iに代入します。良い例は、5:Floatを自分のカスタムタイプに変換しようとする場合です。したがって、impilictコンバータなどを定義する必要がある状況になるでしょう。 – Pavel

+0

どちらの場合も、値が5.0のfloat変数が得られます。少なくともこの例では、バックグラウンドで何が起こっているかとは無関係に等価です。 –

答えて

4

これは、型帰属と呼ばれ、いくつかのオプションが利用可能であるかもしれないときには、種類を明確にするためのものです。

典型的な例は倍です:

val l = 1 to 5 
val stringyfied = l.foldLeft(Nil)((list, elem) => elem.toString :: list) 

その場合のNilの種類は何ですか?あなたがその一例をしようとすると、コンパイルはエラーで吠えます:

error: type mismatch; 
found : List[String] 
required: scala.collection.immutable.Nil.type 

我々は型帰属使用してコンパイラに知られている特定のタイプを行うことができます。

val stringyfied = l.foldLeft(Nil:List[String])((list, elem) => elem.toString :: list) 
// stringyfied: List[String] = List(5, 4, 3, 2, 1) 

別の一般的な使用はしているが

def varargs(a:Int*) = a.sum 
// common use: 
varargs(1,2,3,4,5) //15 

// now we have a collection of elements: 
val intlist = 1 to 5 
// we cannot call varagrs with a list 
varargs(intlist) 
> found : List[Int] 
> required: Int 

// then using type ascription: 
varargs(intlist: _*) 

私の知るところでは、型変換についての詳細な文書はありません。 han式の代数の指定SLS#Chapter6

3

この構文は、型を式に割り当てるときに使用します(val i: Float = 5は型に型を割り当てます)。それはあなたがより大きな表現の一部でそれをするときに違いを生むことができます。

scala> implicit class WeirdFloat(f: Float) { 
    | def +(ff: Float) = new WeirdFloat(f + ff * 2) 
    | override def toString = s"$f" 
    | } 
defined class WeirdFloat 

scala> val i: WeirdFloat = 5 + 7 
i: WeirdFloat = 12.0 

scala> val i = (5: WeirdFloat) + 7 
i: WeirdFloat = 19.0 
2

私は唯一の違いは、最初にあなたがiの種類についての明示的なことされているのに対し、iの種類は、第二の例の値から(コンパイラによって)推定されていることであると信じています。

stye guidelinesは可能な限り推論のタイプの使用を推奨します。しかし、it also mentionsでは、型に値を従わせる構文は、あなたがascriptionを使用しているときのアプローチ - コンパイル時のアップキャスト - です。

scala> val s = "Jane" 
s: String = Jane 

scala> val p = s: Object 
p: Object = Jane