3 回答

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊
類型說明只是告訴編譯器,從所有可能的有效類型中,表達(dá)式期望什么類型。
如果類型遵守現(xiàn)有約束(例如方差和類型聲明),則它是有效的,并且它是表達(dá)式所應(yīng)用的類型之一是“ 是 ”,或者存在適用于范圍的轉(zhuǎn)換。
因此,java.lang.String extends java.lang.Object因此String也是Object。在您的示例中,您聲明希望將表達(dá)式s視為Object,而不是String。由于沒有約束可以阻止這種情況,并且所需的類型s 是a的類型之一,因此它可以工作。
現(xiàn)在,你為什么要那樣?考慮一下:
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)
您也可以通過s在ss聲明中鍵入腳本來解決此問題,或者可以將聲明ss的類型聲明為Set[AnyRef]。
但是,僅在將值分配給標(biāo)識(shí)符時(shí),類型聲明才能實(shí)現(xiàn)相同的目的。當(dāng)然,如果一個(gè)人不關(guān)心用一次性標(biāo)識(shí)符亂扔代碼,那哪一個(gè)總是可以做的。例如,以下內(nèi)容不會(huì)編譯:
def prefixesOf(s: String) = s.foldLeft(Nil) {
case (head :: tail, char) => (head + char) :: head :: tail
case (lst, char) => char.toString :: lst
}
但這確實(shí)是:
def prefixesOf(s: String) = s.foldLeft(Nil: List[String]) {
case (head :: tail, char) => (head + char) :: head :: tail
case (lst, char) => char.toString :: lst
}
在此處使用標(biāo)識(shí)符代替會(huì)很愚蠢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
}
作為參考,這是Scala 2.7規(guī)范(2009年3月15日草案)對(duì)類型歸屬的評(píng)價(jià):
Expr1 ::= ...
| PostfixExpr Ascription
Ascription ::= ‘:’ InfixType
| ‘:’ Annotation {Annotation}
| ‘:’ ‘_’ ‘*’

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊
一種可能性是當(dāng)網(wǎng)絡(luò)和串行協(xié)議級(jí)別的東西出現(xiàn)時(shí),那么:
val x = 2 : Byte
遠(yuǎn)比
val x = 2.asInstanceOf[Byte]
第二種形式也是運(yùn)行時(shí)轉(zhuǎn)換(不由編譯器處理),并且可能導(dǎo)致一些有趣的上溢/下溢情況。

TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個(gè)贊
類型推斷:我們可以跳過在源代碼中明確給出某種類型的名稱,即類型推斷(盡管在某些特殊情況下是必需的)。
Type Ascription:明確表示某種事物的類型稱為Type Ascription。它可以帶來什么不同?
例如:val x = 2:字節(jié)
另請(qǐng)參見:1.我們可以顯式地將返回類型賦予函數(shù)
def t1 : Option[Option[String]] = Some(None)
> t1: Option[Option[String]]
另一種聲明方式可能是:
def t2 = Some(None: Option[String])
> t2: Some[Option[String]]
在這里,我們沒有Option[Option[String]]明確給出返回類型,編譯器將其推斷為Some[Option[String]]。原因Some[Option[String]]是因?yàn)槲覀冊(cè)诙x中使用了類型說明。
我們可以使用相同定義的另一種方法是:
def t3 = Some(None)
> t3: Some[None.type]
這次我們沒有明確告訴編譯器任何東西(也沒有這個(gè)定義)。并推斷出我們的定義為Some [None.type]
分享編輯
添加回答
舉報(bào)