我有一个 class Bar[T <: Foo]
.类型 Bar[_ <: Foo]
之间有什么区别?和 Bar[_]
?我没有看到任何语义差异,因为我不能写类似 new Bar[String]("asdf")
的东西.
然而,scalac
确实区分它们。看起来它忘记了边界并考虑 Bar[_]
成为Bar[_ <: Any]
而不是 Bar[_ <: Foo]
.
请注意,与 Scala 不同,这在 Java 中按预期工作:https://gist.github.com/v6ak/7847548 .我想知道 Java 和 Scala 之间是否存在我不知道的重要语义差异。我知道存在一些差异,例如在具有原始类型的泛型中(尤其是与数组一起使用时),但我不知道与此问题相关的任何信息。
为了让事情变得更奇怪,我从 the mentioned scala code 中反汇编了字节码。 (通过 reJ ),禁用泛型识别并发现 method foo returns always a Foo .
(我没有使用 javap,因为我不能在那里禁用泛型识别。)
最佳答案
关于Scala 类型边界与 Foo[_],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20446736/