Streams backport编译错误

时间:2018-01-08 12:04:36

标签: java-stream java-7

streamsupport与Java 7 javac编译器一起使用时遇到以下编译错误:

  接口java8.util.stream.Stream中的

[ERROR]方法映射< T>   不能适用于给定的类型; [错误]要求:   java8.util.function.Function&LT ;?超级java.lang.Object,?扩展   R>

     

[错误]发现:<匿名   java8.util.function.Function< java.lang.Integer中,java.lang.String中>> [错误]原因:没有类型变量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());

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

1 个答案:

答案 0 :(得分: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());

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

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

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