[英]Why are the bounds of type parameters ignored when using existential types in Scala?
我的意思是:
scala> class Bounded[T <: String](val t: T)
defined class Bounded
scala> val b: Bounded[_] = new Bounded("some string")
b: Bounded[_] = Bounded@2b0a141e
scala> b.t
res0: Any = some string
為什么res0的類型是Any而不是String? 它肯定知道bt至少是一個String。 寫作
val b: Bounded[_ <: String] = new Bounded("some string")
有效,但對於類本身的聲明而言是多余的。
首先,我編輯了問題標題。 您沒有使用Scala不具備的依賴類型,而是存在類型。 其次,你沒有推斷任何東西,你明確地聲明了這種類型。
現在,如果你寫了Bounded[Any]
,Scala不會讓你。 但是,存在類型的一個用途是處理類型參數完全未知的情況 - 例如Java原始類型,其中。
所以我的猜測是,在一個看似足夠明顯的情況下做一個例外會破壞其他情況,其中存在類型是處理某事的唯一方法。
最近在郵件列表上對這個主題進行了長時間的討論, 在Wildcards上輸入Type Boundary“Stickyness” 。
這並不是決定性的,除了同意存在主義類型,例如Bounded[_]
(有Bounded[$1] forSome { type $1 }
的簡寫),不適合直覺。
@extempore確實找到了討論的一個好處:)
從好的方面來說,我終於閱讀規范封面了。 我不知道“黃色潛水艇”的完整歌詞在規格中! 但我不得不承認,在上下文中很難看出該部分可以寫成任何其他方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.