IntelliJ Java 映射流的通用类型推断

问题描述 投票:0回答:1

我已经阅读了有关

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<?>>

java generics intellij-idea stream java-stream
1个回答
0
投票

Intellij 编译器错误地推断了 map 方法的更通用的返回类型(

Stream<? extends Model<?>>
,而它应该是
Stream<Model<?>>
)。 Java 编译器仍然会接受正确的代码,但如果 IDE 警告很烦人,那么您可以通过简单地提供显式类型参数来抑制它:

return List.of(10).stream()
        .<Model<?>>map(Test::getModel)
        .toList();
© www.soinside.com 2019 - 2024. All rights reserved.