Scala 类型边界与 Foo[_]

标签 scala generics types type-bounds

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

最佳答案

您的所有示例都在当前里程碑 2.11.0-M7 中编译。

相关提交:this onethis one .这似乎已在 2.11.0-M3 中修复。

关于Scala 类型边界与 Foo[_],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20446736/

相关文章:

scala - Scala 标识符 "implicitly"是什么?

scala - 如何使用 Akka http 客户端上传非常大的文件

java - Java中接口(interface)和列表的返回类型和参数?

haskell - 类型系列 : top level vs. 相关联

scala - Play 2.0 - 从 Scala 控制台访问正在运行的(假)应用程序

scala - 带 Macwire 的可注入(inject)工厂

c# - 使用泛型类型作为泛型参数的最优雅的方法是什么?

C# 从泛型值到字符串的转换问题

typescript - 声明泛型类型的 const

c - 为什么 C 没有无符号 float ?