需要了解Java泛型教程的帮助吗

需要了解Java泛型教程的帮助吗,java,generics,Java,Generics,我正在读一本来自微软的Java教程。我听不懂一句简单的话 教程说集合的声明。空列表是: 静态列表emptyList() 因此,如果我们编写listOne=Collections.emptyList(),它的工作原理是Java编译器能够推断类型参数,因为返回值的类型应该是List 现在考虑一个方法:无效进程列表(列表STRIGLIST)< /代码>。现在它说: processStringList(Collections.emptyList());JavaSE7编译器 生成类似以下内容的错误消息:

我正在读一本来自微软的Java教程。我听不懂一句简单的话

教程说集合的声明。空列表是:

静态列表emptyList()

因此,如果我们编写
listOne=Collections.emptyList(),它的工作原理是Java编译器能够推断类型参数,因为返回值的类型应该是
List

现在考虑一个方法:<代码>无效进程列表(列表STRIGLIST)< /代码>。现在它说:

processStringList(Collections.emptyList());JavaSE7编译器 生成类似以下内容的错误消息:

名单

编译器需要 类型参数T的值,因此它以value对象开头。 因此,对Collections.emptyList的调用将返回一个值 类型为
列表
,与方法不兼容 processStringList


现在他们的意思是什么:那么它从值对象开始?我的意思是开始做什么?

基本上这是关于编译器的功能。换句话说:在某种程度上,可能的类型推断的“数量”是一个实现细节

在Java7中,您有时必须使用类型helpers/hints/witness,您可以使用
Collections.emptyList()
告诉编译器缺少的部分

编译器的后续实现改善了这种情况,即您几乎可以始终使用
Collections.emptyList()

关于
,编译器需要类型参数T的值,因此它以value对象开头。
。。。这实际上非常简单:java编译器必须实现一个算法,最终推断出一个特定的类型。给出一些伪代码,可能看起来像:

Class<?> inferType(SomeSyntaxTree construct) {
换句话说:当你“搜索”某个值时,这是一种非常常见的方法:你用“最通用”的值(在Java类型系统中,是Object.class)初始化,然后看看是否可以通过应用任何算法来细化该通用值


在我们的例子中,精化可能最终会计算出“可以使用的最特定类型是
字符串
”,但是如果无法进一步精化,那么您最终会得到“初始默认值”,即
对象

,基本上这是关于编译器的功能。换句话说:在某种程度上,可能的类型推断的“数量”是一个实现细节

在Java7中,您有时必须使用类型helpers/hints/witness,您可以使用
Collections.emptyList()
告诉编译器缺少的部分

编译器的后续实现改善了这种情况,即您几乎可以始终使用
Collections.emptyList()

关于
,编译器需要类型参数T的值,因此它以value对象开头。
。。。这实际上非常简单:java编译器必须实现一个算法,最终推断出一个特定的类型。给出一些伪代码,可能看起来像:

Class<?> inferType(SomeSyntaxTree construct) {
换句话说:当你“搜索”某个值时,这是一种非常常见的方法:你用“最通用”的值(在Java类型系统中,是Object.class)初始化,然后看看是否可以通过应用任何算法来细化该通用值

在我们的例子中,精化可能会最终计算出“可以使用的最特定类型是
字符串
”,但如果无法进一步精化,那么您最终会得到“初始默认值”,即语句中的
对象

processStringList(Collections.emptyList())

在Java8中工作良好(我假设也在8以上)。在这种情况下,编译器足够聪明,可以通过检查方法的预期参数类型来推断类型

在旧版本中,当编译器没有看到显式返回类型时(如
List listOne=Collections.emptyList();
),它默认推断
java.lang.Object
。但是请注意,
List
List
不兼容

您可以像声明语句一样声明方法
voidprocessstring(List)

processStringList(Collections.emptyList());

在Java8中工作得很好(我也假设在8以上)。本例中的编译器足够聪明,可以通过检查方法的预期参数类型来推断类型

在旧版本中,当编译器没有看到显式返回类型时(如
List listOne=Collections.emptyList();
),它默认推断
java.lang.Object
。但请注意
List
List
不兼容


您可以像
void processString(ListIt)这样声明该方法。它只是意味着它推断
T
Object
。仅供参考,它进一步解释了他们在Java 8中已经解决了这一问题,因此除非您使用的是遗留代码,否则它基本上是不相关的。
processStringList(Collections.emptyList())
可以很好地推断出类型。@AndyTurner是的,我说了“它进一步解释了[页面]”。除了前面的注释中所述的内容外,我想澄清一下,该行实际上是作为List listOne=Collections.emptyList()处理的;您可以在方法名称之前添加类型参数,即使用作方法参数,它也会像您预期的那样工作。我很欣赏这种快速恢复!它只是意味着它推断
T
对象
。仅供参考,它进一步解释了他们在Java 8中已经修复了这一问题,因此除非您使用的是遗留代码,否则它是无效的基本上不相关。
processStringList(Collections.emptyList())
可以很好地推断类型。@AndyTurner是的,我说了“它解释了[页面]的下一步”。除了前面的评论中所述的内容之外,我想澄清