为什么Diamond运算符不适用于Java 7中的java.util.Collections方法?

西蒙·基桑(Simon Kissane):

在Java 1.7.0_55中,如果我编写此字段声明,则会收到编译错误(“不兼容的类型”):

   private final Map<String,Object> myMap =
       Collections.synchronizedMap(new HashMap<>());

如果我将其改为:

   private final Map<String,Object> myMap =
       Collections.synchronizedMap(new HashMap<String,Object>());

它编译良好。(我在这里以syncedMap为例,但对于其他Collections方法,unmodifiable *,synchronized *等也是如此)

但是,为什么钻石操作员不能像我在这里期望的那样工作?由于Collections.synchronizedMap()声明为:

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {

在我看来,构造函数调用的类型参数必须与字段声明的类型参数相同,并且编译器应该能够基于此推断构造的类类型参数。

我尝试在JLS中寻找一个子句,该子句说这种语法是不可接受的,但是找不到。谁能指出我的意思?

rgettman:

这会因Java 7中的编译器错误而失败,但会在Java 8中成功编译。简而言之,编译器的类型推断未捕获Java 7中正确的推断类型,但更好的类型推断会推断Java 8中的正确类型。

此更改是针对Java 8的JEP(JDK增强建议)101

摘要

平稳地扩展方法类型推断的范围,以支持(i)方法上下文中的推断和(ii)链式调用中的推断。

Java 8能够通过带有参数和方法调用链的多个方法调用来推断类型。现在,它可以从分配的左侧<String, Object>通过调用Collections.synchronizedMap的参数中的菱形运算符的调用来确定new HashMap<>()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在java.util.Collections中声明了静态java.util.Collections.fill()方法而不是在java.util.AbstractList中声明了实例方法?

空条件运算符不适用于泛型方法中的Func <T>

双冒号运算符不适用于Java

为什么在Set / List / Map中用于包装元素的方法的名称中包含'singleton'?(java.util.Collections)

为什么在Java 7中将Diamond运算符用于类型推断?

为什么Java中的toString方法似乎不适用于数组

如何在kotlin中查看java.util.Collections#copy方法?

为什么我的 Timber/Twig 中的运算符不适用于我的条件语句?

定义运算符不再起作用(UseMethod(“%op%”)中的错误:'%op%'的适用方法不适用于类“ character”的对象)

为什么对重载运算符'<<'的异常说明符不适用于任何std :: ostream对象,但对库中定义的异常符无效?

java.util.Collections.sort()方法的时间复杂度是多少?

Jenkins 管道没有方法签名:java.util.Collections$UnmodifiableMap.$()

Maven的清洁命令:java.util.Collections.UnmodifiableRandomAccessList类型为java.util.ArrayList中的财产

为什么在Java 7中从右侧不错过Diamond运算符?

为什么Modelica中的“ der()”运算符仅适用于时间变量?

在C ++ 20中,为什么有std :: vector运算符==不适用于具有不同分配器的向量?

适用于Java的运算符重载插件

没有方法签名:java.util.Date.parse()适用于参数类型

java.util.hashMap中的init方法

Java Collections hasnext()方法

如果存在JsonSerializer <Timestamp>(),则JsonSerializer <Date>()不适用于java.util.Date字段。

Eclipse的Content Assist不适用于java.util.Comparator

Java中的split()方法不适用于点(。)

类型中的方法不适用于参数java

Java 7 Diamond运算符:为什么难以实现?

为什么Java 7 Diamond运算符不能与匿名类一起使用?

java.util.Collections上的Java泛型警告

Delphi-隐式类型转换运算符不适用于方法参数

正则表达式匹配“ java.util”,但不匹配“ java.util.Collections”