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)
我想知道该怎么做以及为什么会出现这个错误?谢谢
您必须准备好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>iterate和Collectors.<String>toList.
第一个是帮助编译器推断出正确的map调用类型,第二个是那里,以便正确推断结果List<String>而不是List<Object>.
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |