類型歸屬只是告訴編譯器從所有可能的有效類型中,期望從表達式中找出什麼類型。
A型是有效的,如果它尊重現有的限制,諸如方差和類型聲明,它要麼是所述類型中的一種的表達它適用於「是」,或者有適用的範圍轉換。
因此,java.lang.String extends java.lang.Object
,因此任何String
也是Object
。在你的例子中,你聲明你希望表達式s
被視爲Object
,而不是String
。由於不存在限制,所需類型爲s
爲,因此它可以工作。
現在,你爲什麼要這樣做?試想一下:
scala> val s = "Dave"
s: java.lang.String = Dave
scala> val p = s: Object
p: java.lang.Object = Dave
scala> val ss = scala.collection.mutable.Set(s)
ss: scala.collection.mutable.Set[java.lang.String] = Set(Dave)
scala> val ps = scala.collection.mutable.Set(p)
ps: scala.collection.mutable.Set[java.lang.Object] = Set(Dave)
scala> ss += Nil
<console>:7: error: type mismatch;
found : scala.collection.immutable.Nil.type (with underlying type object Nil)
required: java.lang.String
ss += Nil
^
scala> ps += Nil
res3: ps.type = Set(List(), Dave)
你也按類型ascripting s
在ss
聲明中的固定這一點,或者你也可以聲明ss
的類型爲Set[AnyRef]
。
但是,類型聲明只有在您爲標識符分配值時纔會實現相同的功能。當然,如果一個人不關心使用一次性標識符亂拋垃圾代碼,哪一個人總是可以這樣做。例如,以下不會編譯:
def prefixesOf(s: String) = s.foldLeft(Nil) {
case (head :: tail, char) => (head + char) :: head :: tail
case (lst, char) => char.toString :: lst
}
但這:
def prefixesOf(s: String) = s.foldLeft(Nil: List[String]) {
case (head :: tail, char) => (head + char) :: head :: tail
case (lst, char) => char.toString :: lst
}
這將是愚蠢的,到位的Nil
這裏使用的標識符。儘管我只能寫List[String]()
,但這並不總是一種選擇。考慮這一點,例如:
def firstVowel(s: String) = s.foldLeft(None: Option[Char]) {
case (None, char) => if ("aeiou" contains char.toLower) Some(char) else None
case (vowel, _) => vowel
}
對於參考,這是斯卡拉2.7規範(2009年3月15日草案)有什麼看法類型歸屬:
Expr1 ::= ...
| PostfixExpr Ascription
Ascription ::= ‘:’ InfixType
| ‘:’ Annotation {Annotation}
| ‘:’ ‘_’ ‘*’
呃,學到了一些新東西。我做了一個不幸的數量的網絡協議的東西。很高興知道! – 2010-01-26 03:50:46
爲什麼不使用日常語法? 'val x:Byte = 2' – Jerry101 2015-02-02 22:09:06