亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Scala中的類型歸屬的目的是什么?

Scala中的類型歸屬的目的是什么?

蝴蝶刀刀 2019-11-27 10:05:30
規范中關于類型歸屬的信息不多,而且關于目的的用途當然也沒有。除了“使傳遞的varargs起作用”之外,我還要使用類型歸屬嗎?以下是一些scala REPL,以了解使用它的語法和效果。scala> val s = "Dave"s: java.lang.String = Davescala> val p = s:Objectp: java.lang.Object = Davescala> p.length<console>:7: error: value length is not a member of java.lang.Object       p.length         ^scala> p.getClassres10: java.lang.Class[_ <: java.lang.Object] = class java.lang.Stringscala> s.getClassres11: java.lang.Class[_ <: java.lang.Object] = class java.lang.Stringscala> p.asInstanceOf[String].length
查看完整描述

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}

             | ‘:’ ‘_’ ‘*’


查看完整回答
反對 回復 2019-11-27
?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

一種可能性是當網絡和串行協議級別的東西出現時,那么:


val x = 2 : Byte

遠比


val x = 2.asInstanceOf[Byte]

第二種形式也是運行時轉換(不由編譯器處理),并且可能導致一些有趣的上溢/下溢情況。


查看完整回答
反對 回復 2019-11-27
?
HUWWW

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]


分享編輯


查看完整回答
反對 回復 2019-11-27
  • 3 回答
  • 0 關注
  • 492 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號