流向后移植编译错误

Streams backport compile error

使用 streamsupport 和 Java 7 javac 编译器我遇到以下编译错误:

[ERROR] method map in interface java8.util.stream.Stream<T> cannot be applied to given types; [ERROR] required: java8.util.function.Function<? super java.lang.Object,? extends R>

[ERROR] found: <anonymous java8.util.function.Function<java.lang.Integer,java.lang.String>> [ERROR] reason: no instance(s) of type variable(s) R exist so that argument type <anonymous java8.util.function.Function<java.lang.Integer,java.lang.String>> conforms to formal parameter type java8.util.function.Function<? super java.lang.Object,? extends 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());

我想知道该怎么办以及为什么会出现此错误?谢谢

您必须做好准备,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());

注意这里的两种证人:

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

第一个用于帮助编译器推断 map 调用的正确类型,第二个用于将结果正确推断为 List<String> 而不是 List<Object> .