gpt4 book ai didi

java - 在理解 Java 泛型教程方面需要帮助

转载 作者:行者123 更新时间:2023-11-29 07:25:18 24 4
gpt4 key购买 nike

我正在阅读来自 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()); The Java SE 7 compiler generates an error message similar to the following:

List<'Object> cannot be converted to List<'String>

The compiler requires a value for the type argument T so it starts with the value Object. Consequently, the invocation of Collections.emptyList returns a value of type List<Object>, which is incompatible with the method processStringList

现在它们是什么意思:所以它以值 Object 开头?我的意思是开始做什么?

最佳答案

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

在 Java 7 中,您有时必须使用类型帮助器/提示/见证,您可以在其中使用 Collections.<String>emptyList() 来告诉编译器缺少的部分。

后来的编译器实现改善了你几乎总是可以使用 Collections.emptyList() 的情况。

关于 The compiler requires a value for the type argument T so it starts with the value Object. ... 这其实很简单:java 编译器必须实现一个算法,最终推断出一个特定的类型。给出一些伪代码,可能看起来像:

Class<?> inferType(SomeSyntaxTree construct) {

我只是在这里使用 Class 来表示该算法将返回类似于已知类型的内容。现在,该方法可以像这样实现:

 Class<?> inferedType = Object.class
while (whatever) {
refine inferedType
}
return inferedType

换句话说:当您“搜索”某个值时,这是一种非常常见的方法:您使用“最通用”的值(在 Java 类型系统中,即 Object.class)进行初始化,然后您会看到如果可以通过应用任何算法来改进该通用值。

在我们的例子中,优化可能最终会确定“可以使用的最具体的类型是 String ”,但如果无法进一步优化,那么您最终会得到“初始默认值”,即 Object

关于java - 在理解 Java 泛型教程方面需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54326487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com