为什么赢了';t Java解决此问题<;通用>;方法签名?

为什么赢了';t Java解决此问题<;通用>;方法签名?,java,generics,compiler-errors,Java,Generics,Compiler Errors,我今天用我认为应该有效的代码破坏了一个构建: import java.util.Collections; import java.util.HashMap; import java.util.List; public class EmptyListTest { public static void main(String[] args) { HashMap<Integer,List<String>> map = new HashMap<In

我今天用我认为应该有效的代码破坏了一个构建:

import java.util.Collections;
import java.util.HashMap;
import java.util.List;

public class EmptyListTest {
    public static void main(String[] args) {
        HashMap<Integer,List<String>> map = new HashMap<Integer,List<String>>();

        map.put(Integer.valueOf(0), Collections.emptyList());
    }
}
显然要做的事情是通过向
集合.emptyList()
添加强制转换来帮助Oracle编译器,但这当然会导致其自身的编译器错误(对于Eclipse和
javac
):

/Users/chris/Documents/Eclipse/chadis-web/src/java/EmptyListTest.java:9:错误:不兼容类型:无法将列表转换为列表
map.put(Integer.valueOf(0),(List)Collections.emptyList());
我很清楚Java对泛型的支持在官方上是很糟糕的,但这似乎是一个应该起作用的常见情况。我知道我可以用正确的数据类型手动实例化一个空列表,但这是浪费。我知道我可以将这行代码分成两行(一行是声明
List
并分配给
Collections.emptyList()
,另一行是调用
Map.put()
,但这只是多余的代码,没有任何理由

我还能做些什么来说服Oracle的
javac
这个代码是有效的吗

更新:使用Eclipse Luna(不确定编译器版本)和Oracle Java 1.8.0_151

更新2:看起来这是由于编译器的参数之一是
-source 1.5
造成的。对
javac
使用默认的
source
不会导致任何错误。奇怪的是
Collections.emptyList()
在自Java 1.5以来未发生更改的情况下,在不同版本之间的行为有所不同。不同版本之间的擦除处理肯定发生了某种变化,这使得它在不同的源代码兼容级别上的工作方式有所不同。

在某些Java版本中(Java 8之前的版本,包括源代码兼容性设置小于
1.8
的Java 8)您需要指定泛型类型,以便
emptyList
将返回泛型列表,而不是原始列表。您可以使用:

Collections.<String>emptyList()
Collections.emptyList()
在较新的Java版本中,编译器可以从上下文推断出所需的泛型类型,因此您不需要指定它。这种推断是为了在使用流时不必在链的每一步都指定泛型类型。

在某些Java版本中(Java 8之前的版本,包括源代码兼容性设置小于
1.8
的Java 8)您需要指定泛型类型,以便
emptyList
将返回泛型列表,而不是原始列表。您可以使用:

Collections.<String>emptyList()
Collections.emptyList()

在较新的Java版本中,编译器可以从上下文推断出所需的泛型类型,因此您不需要指定它。这种推断是为了在使用流时不必在链中的每一步都指定泛型类型。

是否尝试过
Collections.emptyList()
?您的Eclipse是在Java 9上而Java C是Java 8上吗?哦,我知道..您使用Eclipse编写和测试代码,但maven构建失败,因为他使用oracle编译器…:Di使用jdk 1.8.0-144编译了它,它可以正常工作..一定是对不同版本的擦除处理进行了某种更改,这使得它在不同的时间工作不同的源代码兼容性级别。这不是关于擦除,而是关于类型推断,正是为了实现这一点。您是否尝试过
Collections.emptyList()
?您的Eclipse是在Java 9上而Java C是Java 8上吗?哦,我知道..您使用Eclipse编写和测试代码,但maven构建失败,因为他使用oracle编译器…:Di使用jdk 1.8.0-144编译了它,它可以正常工作..一定是对不同版本的擦除处理进行了某种更改,这使得它在不同的时间工作不同的源代码兼容性级别。这不是关于擦除,而是关于类型推断,这正是为了实现这一点。哇,这是什么样的巫术?这是正常的巫术。这是为方法指定泛型类型参数的正常方式。只需提一提,错误只出现在早于8的Java版本中。感谢您的解释anation和reference。哇,这是什么巫术?这是正常的巫术。这是为一个方法指定泛型类型参数的正常方式。只需提及,错误只出现在早于8的Java版本中。感谢您的解释和参考。
Collections.<String>emptyList()