为什么使用 Foo[T <: Bar] 需要 Foo[_ <: Bar] 而不是 Foo[_]
Why does usage of Foo[T <: Bar] require Foo[_ <: Bar] rather than Foo[_]
给定
trait Foo[T <: Bar] {
def foo: T
}
为什么编译器 NOT 像
那样解释签名
def foo(f: Foo[_])
表示未知_
必须是Bar
的一种。相反,它迫使我这样做
def foo(f: Foo[_ <: Bar])
这使签名变得复杂。我确定编译器一定是正确的,我遗漏了一些微妙之处,但显然 Foo[X]
其中 X
是 NOT 某种 Bar
所以不可能通过构造,那为什么呢?
谢谢。
简而言之 - 似乎是编译器的缺陷以及是否解决它的悬而未决的问题。修复它可能会产生意想不到的后果,但它经常被提出来,仍然被认真考虑为一个可能的修复方法。以下是一些最相关且仍未解决的错误票。
P.S。看来 Dotty 确实尊重这样的界限,所以他们很可能会修复它!
- https://github.com/scala/bug/issues/11491 - 自 2019 年 4 月 17 日起
- https://github.com/scala/bug/issues/8198 - 自 2014 年 1 月 28 日起
- https://github.com/scala/bug/issues/1786 - 从 2009 年 3 月 11 日开始
给定
trait Foo[T <: Bar] {
def foo: T
}
为什么编译器 NOT 像
那样解释签名def foo(f: Foo[_])
表示未知_
必须是Bar
的一种。相反,它迫使我这样做
def foo(f: Foo[_ <: Bar])
这使签名变得复杂。我确定编译器一定是正确的,我遗漏了一些微妙之处,但显然 Foo[X]
其中 X
是 NOT 某种 Bar
所以不可能通过构造,那为什么呢?
谢谢。
简而言之 - 似乎是编译器的缺陷以及是否解决它的悬而未决的问题。修复它可能会产生意想不到的后果,但它经常被提出来,仍然被认真考虑为一个可能的修复方法。以下是一些最相关且仍未解决的错误票。
P.S。看来 Dotty 确实尊重这样的界限,所以他们很可能会修复它!
- https://github.com/scala/bug/issues/11491 - 自 2019 年 4 月 17 日起
- https://github.com/scala/bug/issues/8198 - 自 2014 年 1 月 28 日起
- https://github.com/scala/bug/issues/1786 - 从 2009 年 3 月 11 日开始