我已经阅读了有关
toList
和 Collectors.toList()
之间区别的问题
这里但是这个问题与那个问题不同。
想象一下下面的课程:
public class Test {
private static List<Model<?>> getModels() {
return List.of(10).stream()
.map(Test::getModel)
.toList();
}
private static Model<?> getModel(int key) {
return new Model<>(key);
}
public static void main(String... str) {
System.out.println("Hello World!" + getModels());
}
public static class Model<T> {
private T field;
Model(T key) {
field = key;
}
public String toString() {
return "Model(" + field + ")";
}
}
}
我很好奇为什么 IntelliJ 在映射阶段后无法推断流的类型,并显示错误? 这里。
当我如下所示在地图阶段显式添加类型时,它工作正常。
public class Test {
private static List<Model<?>> getModels() {
return List.of(10).stream()
.<Model<?>>map(Test::getModel)
.toList();
}
private static Model<?> getModel(int key) {
return new Model<>(key);
}
public static void main(String... str) {
System.out.println("Hello World!" + getModels());
}
public static class Model<T> {
private T field;
Model(T key) {
field = key;
}
public String toString() {
return "Model(" + field + ")";
}
}
}
为什么IntelliJ显示错误,但编译完成没有任何错误?当我将鼠标悬停在它上面时,会显示此错误:
Required type: List<Model<?>>
Provided: List<? extends Model<?>>
Intellij 编译器错误地推断了 map 方法的更通用的返回类型(
Stream<? extends Model<?>>
,而它应该是 Stream<Model<?>>
)。 Java 编译器仍然会接受正确的代码,但如果 IDE 警告很烦人,那么您可以通过简单地提供显式类型参数来抑制它:
return List.of(10).stream()
.<Model<?>>map(Test::getModel)
.toList();