Streams backport编译错误

use*_*440 1 java-7 java-stream

使用与Java 7 编译器的streamsupportjavac我遇到以下编译错误:

接口java8.util.stream.Stream <T>中的[ERROR]方法映射不能应用于给定类型; 需要[ERROR]:java8.util.function.Function <?超级java.lang.Object,?扩展R>

[ERROR]发现:<anonymous java8.util.function.Function <java.lang.Integer,java.lang.String >> [ERROR]原因:没有类型变量的实例R存在以便参数类型<anonymous java8.util.function.Function <java.lang.Integer,java.lang.String >>符合形式参数类型java8.util.function.Function <?超级java.lang.Object,?扩展R>

我的代码是

List<Object> listSum = RefStreams.iterate(0, new UnaryOperator<Integer>() {
            @Override
            public Integer apply(Integer n) {
                return n+1;
            }
        }).limit(10000).map(new Function<Integer,String>() {
            @Override
            public String apply(Integer n) {
                return String.format("%04d", n);
            }

        }).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我想知道该怎么做以及为什么会出现这个错误?谢谢

Ste*_*bel 6

您必须准备好Java 6/7编译器中的类型推断不能与Java 8/Java 9编译器相提并论.因此,有时用8编译的语句/表达式不能用6或7编译.提供类型见证通常有助于编译器在Java 6/7中找出正确的类型.

我会这样做(这适用于我使用Oracle JDK 1.7.0_80中的javac):

List<String> list = RefStreams.<Integer, Integer>iterate(0, new UnaryOperator<Integer>() {
    @Override
    public Integer apply(Integer n) {
        return n + 1;
    }
}).limit(10000).map(new Function<Integer, String>() {
    @Override
    public String apply(Integer n) {
        return String.format("%04d", n);
    }
}).collect(Collectors.<String>toList());
Run Code Online (Sandbox Code Playgroud)

请注意这里的两个类型证人:

RefStreams.<Integer, Integer>iterateCollectors.<String>toList.

第一个是帮助编译器推断出正确的map调用类型,第二个是那里,以便正确推断结果List<String>而不是List<Object>.