簡體   English   中英

在Scala中使用存在類型時,為什么忽略類型參數的邊界?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM