我有一个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 因为我不能在那里禁用泛型识别。)