我观看了 Oracle OTN 虚拟活动:Java SE 和 JavaFX 2.0(2012 年 2 月 28 日),在谈到新的菱形运算符(那个Map<String, List<String>> myMap = new HashMap<>();
东西)时,演讲者提到它的实现并不像人们想象的那么简单,因为它不是一个简单的令牌替换。
我的问题是为什么?为什么不能将其实现为简单地从变量声明中获取字符串并将其放入菱形运算符中?
我观看了 Oracle OTN 虚拟活动:Java SE 和 JavaFX 2.0(2012 年 2 月 28 日),在谈到新的菱形运算符(那个Map<String, List<String>> myMap = new HashMap<>();
东西)时,演讲者提到它的实现并不像人们想象的那么简单,因为它不是一个简单的令牌替换。
我的问题是为什么?为什么不能将其实现为简单地从变量声明中获取字符串并将其放入菱形运算符中?
我也没有实现它,所以我只能猜测。
但通常这些事情比看起来更复杂的原因是第一次检查只查看最常见(或最广为人知的)用例。在这种情况下,它就是您提到的那个。从理论上讲,这应该很容易准确指定,并且应该很容易在编译器中实现。
但是,菱形运算符(顺便说一下,它在技术上不是运算符)也可以以不同的方式使用:
someMethodWithGenericArguments(new HashMap<>());
new SomeGenericClass(new HashMap<>());
T foo = new SomethingRelatedToT<>(); // where T is a generic type parameter
在这些情况下,简单的令牌替换显然不再有效,您需要涉及真实类型分析的实际类型推断(即,它与简单的令牌替换处于完全不同的抽象级别)。
Java 不做的事情(许多语言都有)是基于使用的隐含类型。即Java 并不意味着基于它的使用方式的要求类型。
例如
Type a = b;
的类型a
和类型是独立的,不基于 的类型b
做任何假设。b
a
MethodHandles 显示出支持这一点的迹象。返回类型的使用可以基于上下文,但这是一个运行时特性。
总之,我的假设是;在 Java 中很难实现,因为该语言不支持任何类似的语言。如果该语言一直使用这样的功能,那么编译器中的工具将理解(根据定义它应该如何工作的规范)并支持所采用的方法。