为什么使用 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] 其中 XNOT 某种 Bar所以不可能通过构造,那为什么呢?

谢谢。

简而言之 - 似乎是编译器的缺陷以及是否解决它的悬而未决的问题。修复它可能会产生意想不到的后果,但它经常被提出来,仍然被认真考虑为一个可能的修复方法。以下是一些最相关且仍未解决的错误票。

P.S。看来 Dotty 确实尊重这样的界限,所以他们很可能会修复它!