2016-12-05 67 views
2

Scala中,如果我有一個聲明,像這樣:右側的Scala類型註釋?

val i: Float = 5 

這是同樣喜歡這一行:

val i = 5: Float 

最近我在右邊遇到了一個帶有這種類型註釋的表達式,我不知道它的用法是什麼,因爲我在規範中找不到它。

+0

我會做一個假設,在第一種情況下,你定義一個值爲浮動。在第二種情況下,將值爲5的Float賦值給i。舉個例子,如果你想將5:Float轉換成你自己的自定義類型。因此,您將處於必須定義impilict轉換器等情況。 – Pavel

+0

在這兩種情況下,您都會得到一個值爲5.0的浮點型變量。至少在這個例子中,它們是平等的,與背景中發生的事情無關。 –

回答

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: _*) 

據我所知,有沒有關於類型歸屬等牛逼很多具體文件漢表達式的代數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您使用類型的值跟隨該值的語法是使用歸屬時的方法 - 編譯時間上傳。

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

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