我有一个class Bar[T <: Foo]。typeBar[_ <: Foo]和 和有什么不一样Bar[_]?我没有看到任何语义上的差异,因为我不能写任何类似new Bar[String]("asdf").
但是,scalac确实将它们区分开来。看起来它忘记了界限并认为Bar[_]是 aBar[_ <: Any]而不是Bar[_ <: Foo]。
请注意,这在 Java 中按预期工作,与 Scala 不同:https ://gist.github.com/v6ak/7847548 。我想知道 Java 和 Scala 之间是否存在我不知道的重要语义差异。我知道存在一些差异,例如在具有原始类型的泛型中(尤其是与数组一起使用时),但我不知道与此问题相关的任何内容。
为了让事情变得更奇怪,我从提到的 scala 代码(通过reJ)中反汇编了字节码,禁用了泛型识别并发现方法 foo 总是返回一个 Foo。
(我没有使用 javap 因为我不能在那里禁用泛型识别。)