将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());
我想知道该怎么做以及为什么会出现这个错误?感谢
答案 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>iterate
和Collectors.<String>toList
。
第一个是帮助编译器推断map
调用的正确类型,第二个是那里,以便将结果正确推断为List<String>
而不是List<Object>
。< / p>