为什么赢了';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()