我有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,因为我无法在那里禁用泛型识别。)