3 回答

TA貢獻1847條經驗 獲得超11個贊
類型說明只是告訴編譯器,從所有可能的有效類型中,表達式期望什么類型。
如果類型遵守現有約束(例如方差和類型聲明),則它是有效的,并且它是表達式所應用的類型之一是“ 是 ”,或者存在適用于范圍的轉換。
因此,java.lang.String extends java.lang.Object因此String也是Object。在您的示例中,您聲明希望將表達式s視為Object,而不是String。由于沒有約束可以阻止這種情況,并且所需的類型s 是a的類型之一,因此它可以工作。
現在,你為什么要那樣?考慮一下:
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]。
但是,僅在將值分配給標識符時,類型聲明才能實現相同的目的。當然,如果一個人不關心用一次性標識符亂扔代碼,那哪一個總是可以做的。例如,以下內容不會編譯:
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
}
作為參考,這是Scala 2.7規范(2009年3月15日草案)對類型歸屬的評價:
Expr1 ::= ...
| PostfixExpr Ascription
Ascription ::= ‘:’ InfixType
| ‘:’ Annotation {Annotation}
| ‘:’ ‘_’ ‘*’

TA貢獻1806條經驗 獲得超8個贊
一種可能性是當網絡和串行協議級別的東西出現時,那么:
val x = 2 : Byte
遠比
val x = 2.asInstanceOf[Byte]
第二種形式也是運行時轉換(不由編譯器處理),并且可能導致一些有趣的上溢/下溢情況。

TA貢獻1874條經驗 獲得超12個贊
類型推斷:我們可以跳過在源代碼中明確給出某種類型的名稱,即類型推斷(盡管在某些特殊情況下是必需的)。
Type Ascription:明確表示某種事物的類型稱為Type Ascription。它可以帶來什么不同?
例如:val x = 2:字節
另請參見:1.我們可以顯式地將返回類型賦予函數
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]]是因為我們在定義中使用了類型說明。
我們可以使用相同定義的另一種方法是:
def t3 = Some(None)
> t3: Some[None.type]
這次我們沒有明確告訴編譯器任何東西(也沒有這個定義)。并推斷出我們的定義為Some [None.type]
分享編輯
- 3 回答
- 0 關注
- 492 瀏覽
相關問題推薦
添加回答
舉報