【发布时间】:2011-01-01 13:28:13
【问题描述】:
自从我听说过类型推断(在 Haskell 中),我一直认为 Java 正好相反,即它没有类型推断。不过最近,我有一个瞬间,意识到 Java 在其泛型实现中采用了类型推断。
然后,我阅读了 Gilad Bracha 的两篇论文(据我所知,他是 Java 中泛型实现背后的人之一)。第一篇论文是tutorial about generics (PDF),其中他明确表示编译器将推断用于替换格式类型参数的实际类型参数。所以,Java 中有类型推断,但为什么只针对泛型,为什么不使用 C# 的 var 关键字?这是我的问题。
为什么 Java 没有在编译器中内置更多类型推断?
不过,我会建议一个答案,这与我阅读的第二篇论文 Pluggable Type Systems (PDF) 有关。看来,Gilad Bracha 认为推理部分不应该是编译器的一部分,而是 IDE 功能或类似功能(上述论文第 4 节第 6 段):
更好的工程方法是 将类型推断作为单独的实现 工具,在 IDE 中可用。 发现输入类型的程序员 令人厌烦的注释可以调用 按需推理。
你怎么看?
【问题讨论】:
-
有趣的是,您使用 var 关键字作为示例 - 当与 C# 匿名类型一起使用时,它提供了一个类型推断的鲜明示例,如果不将其融入编译器。
-
@Kirk - 我看不出
var的类型推断必须如何在编译器中进行烘焙。许多动态语言允许您执行类似 C# 的匿名类型(例如 JavaScript)的操作。可插入类型系统可以访问源代码,因此它可以推断出类似匿名类型的东西......(并检查它的结构,因为它没有名称) -
@Tomas,Javascript 既不是静态类型的也不是编译语言,所以你的比较是错误的。
-
@Kirk - 当然,我并不是在暗示它是。我很高兴地说,可插拔类型系统应该能够处理匿名类型,例如如果有人为 JavaScript 创建了一个可插入的类型系统。我的问题是,是什么让匿名类型的类型推断特别?
标签: java generics type-inference