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