Java 7 钻石运算符:为什么很难实现?

2022-09-03 07:00:26

我观看了Oracle OTN Virtual Event:Java SE和JavaFX 2.0(2012年2月28日),在谈论新的钻石运算符(那个东西)时,演讲者提到它并不像人们想象的那么简单,因为它不是一个简单的令牌替换。Map<String, List<String>> myMap = new HashMap<>();

我的问题是为什么?为什么不能简单地从变量的声明中获取字符串并将其放入菱形运算符中来实现呢?


答案 1

我也没有实现它,所以我只能猜测。

通常这些事情比看起来更复杂的原因是,第一次检查只关注最常见(或最公开)的用例。在这种情况下,它是你提到的那个。从理论上讲,这应该很容易准确指定,并且在编译器中实现应该相当容易。

但是,钻石操作员(顺便说一句,从技术上讲不是操作员)也可以以不同的方式使用:

someMethodWithGenericArguments(new HashMap<>());
new SomeGenericClass(new HashMap<>());
T foo = new SomethingRelatedToT<>(); // where T is a generic type parameter

在这些情况下,简单的令牌替换显然不再有效,您需要涉及实际类型分析的实际类型推断(即,它与简单的令牌替换处于完全不同的抽象级别)。


答案 2

Java不做的事情(许多语言都有)是基于用法的隐含类型。即Java并不意味着基于其使用方式的 require 类型。

例如:

 Type a = b;

的类型和 的类型是独立的,不会根据 的类型做出任何假设。abba

MethodHandles正在显示出支持这一点的迹象。返回类型使用可以基于上下文,但这是一个运行时功能。

最后,我的假设是;它很难在Java中实现,因为该语言不支持任何类似的语言。如果语言一直使用这样的功能,那么要采取的方法将被理解(就定义它应该如何工作的规范而言),并得到编译器中工具的支持。


推荐