Scala中,如果我有一個聲明,像這樣:右側的Scala類型註釋?
val i: Float = 5
這是同樣喜歡這一行:
val i = 5: Float
?
最近我在右邊遇到了一個帶有這種類型註釋的表達式,我不知道它的用法是什麼,因爲我在規範中找不到它。
Scala中,如果我有一個聲明,像這樣:右側的Scala類型註釋?
val i: Float = 5
這是同樣喜歡這一行:
val i = 5: Float
?
最近我在右邊遇到了一個帶有這種類型註釋的表達式,我不知道它的用法是什麼,因爲我在規範中找不到它。
這就是所謂的類型歸屬和它的意思的歧義類型時,幾個選項可能是可用的。
一個典型的例子是摺疊:
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
此語法用於將類型指定給表達式(而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
相信,唯一的區別是,i
類型是從在第二示例中的值推斷(由編譯器),而在所述第一要顯式說明有關的i
類型。
stye guidelines鼓勵儘可能使用推斷類型。但是,it also mentions您使用類型的值跟隨該值的語法是使用歸屬時的方法 - 編譯時間上傳。
scala> val s = "Jane"
s: String = Jane
scala> val p = s: Object
p: Object = Jane
我會做一個假設,在第一種情況下,你定義一個值爲浮動。在第二種情況下,將值爲5的Float賦值給i。舉個例子,如果你想將5:Float轉換成你自己的自定義類型。因此,您將處於必須定義impilict轉換器等情況。 – Pavel
在這兩種情況下,您都會得到一個值爲5.0的浮點型變量。至少在這個例子中,它們是平等的,與背景中發生的事情無關。 –