Home  >  Article  >  Generic type inference for IntelliJ Java mapping streams

Generic type inference for IntelliJ Java mapping streams

WBOY
WBOYforward
2024-02-22 12:40:27896browse

php editor Xigua brings you a java Q&A column. This issue discusses the general type inference of mapping streams in IntelliJ Java. During the development process, rational use of universal type inference can improve code writing efficiency and reduce redundant code. Through the discussions and examples in this article, readers can better understand and apply the mapping flow in IntelliJ Java and further improve their programming skills.

Question content

Imagine the following class:

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 + ")";
        }

    }

}

I'm curious why intellij cannot infer the type of the stream after the mapping phase and displays an error?

When I add the type explicitly in the map stage as shown below, it works fine.

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 + ")";
        }

    }

}

Why does intellij show an error, but there is no error in compilation? When I hover over it, it shows this error:

Required type: List<Model<?>>

Provided: List<? extends Model<?>>

Workaround

intellij The compiler incorrectly inferred the more general return type of the map method (streamed7af423ac93edbafbfac8373c81f6ff>, when it should be streamb39763702b7235adb5697e820e631fce>). The java compiler will still accept the code as it is correct, but if the IDE warning is annoying then you can suppress it by simply providing an explicit type argument:

return List.of(10).stream()
        .<Model<?>>map(Test::getModel)
        .toList();

The above is the detailed content of Generic type inference for IntelliJ Java mapping streams. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete