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