【发布时间】:2019-01-28 18:09:20
【问题描述】:
我正在阅读来自here 的 Java 教程。我无法理解一条简单的线。
教程说Collections.emptyList的声明是:
static <T> List<T> emptyList();
所以如果我们写List<String> listOne = Collections.emptyList();,它的工作原理是Java编译器能够推断类型参数,因为返回的值应该是List<String>类型。
现在考虑一个方法:void processStringList(List<String> stringList)。现在它指出:
processStringList(Collections.emptyList()); Java SE 7 编译器 生成类似于以下的错误消息:
List 无法转换为 List
编译器需要 类型参数 T 的值,因此它以值 Object 开头。 因此, Collections.emptyList 的调用返回一个值
List<Object>类型的,与方法不兼容 进程字符串列表
现在它们是什么意思:所以它以值 Object 开头?我的意思是开始做什么?
【问题讨论】:
-
它只是意味着它推断
T是Object。 -
仅供参考,它进一步解释说他们已经在 Java 8 中修复了这个问题,所以除非你使用的是遗留代码,否则它基本上是无关紧要的。
processStringList(Collections.emptyList())很好地推断出类型。 -
@AndyTurner 是的,我说“它在 [页面] 下方进一步解释”
-
除了前面的cmets中所说的,我想澄清一下,该行实际上被处理为List
listOne = Collections. emptyList();您可以在方法名称之前添加类型参数,即使用作方法参数,它也会按照您的预期工作。 -
感谢您的快速回归!