Java 错误的对象';可能返回空流后的s类型
我编写了以下代码:Java 错误的对象';可能返回空流后的s类型,java,object,lambda,casting,java-stream,Java,Object,Lambda,Casting,Java Stream,我编写了以下代码: Set<Pair<Predicate>> interestingPairs = ... ... interestingPairs.stream() .filter(pair -> pair.getFirst().isNegated() == pair.getSecond().isNegated()) .flatMap( pair -> findUnification(pair)
Set<Pair<Predicate>> interestingPairs = ...
...
interestingPairs.stream()
.filter(pair -> pair.getFirst().isNegated() == pair.getSecond().isNegated())
.flatMap( pair -> findUnification(pair)
.map(u -> {
Set<String> aVars = pair.getFirst().getAllVariables();
Set<String> bVars = pair.getSecond().getAllVariables();
if(u.sigma.isEmptyOrVarByVar(aVars) && !u.sigmaPrime.isEmptyOrVarByVar(bVars))
return Stream.of(pair.getFirst());
if (!u.sigma.isEmptyOrVarByVar(bVars) && u.sigmaPrime.isEmptyOrVarByVar(aVars))
return Stream.of(pair.getSecond());
return Stream.empty();
})
.orElse(Stream.empty()))
.forEach(toRemove -> this.predicates.remove((Predicate)toRemove));
Set interestingPairs=。。。
...
interestingPairs.stream()
.filter(pair->pair.getFirst().isNegated()==pair.getSecond().isNegated())
.flatMap(对->findUnification(对)
.地图(u->{
设置aVars=pair.getFirst().getAllVariables();
Set bVars=pair.getSecond().getAllVariables();
if(u.sigma.isEmptyOrVarByVar(aVars)和&!u.sigmaPrime.isEmptyOrVarByVar(bVars))
返回Stream.of(pair.getFirst());
if(!u.sigma.isEmptyOrVarByVar(bVars)和&u.sigmaPrime.isEmptyOrVarByVar(aVars))
返回流.of(pair.getSecond());
返回Stream.empty();
})
.orElse(Stream.empty())
.forEach(toRemove->this.predicates.remove((谓词)toRemove));
我正在使用IntellijIDE。在
flatMap
之后,我的流的操作元素具有对象
类型,而不是谓词
,因此在foreach
中,toRemove没有所需的类型。当我将return Stream.empty()
更改为return Stream.empty()
时,flatMap
之后的对象类型是谓词。如果不是.orElse(Stream.empty())
而我不必添加的话,我甚至会理解这一点。我假设您的谓词是您自定义的非泛型类型,而不是java.util.function.Predicate
。编译器似乎无法推断.flatMap
参数的类型。您可以帮助它明确指定它:
interestingPairs.stream()
.filter(pair -> pair.getFirst().isNegated() == pair.getSecond().isNegated())
.<Predicate>flatMap( pair -> findUnification(pair)
... and so on
interestingPairs.stream()
.filter(pair->pair.getFirst().isNegated()==pair.getSecond().isNegated())
.flatMap(对->findUnification(对)
等等
据我所知,当前的JLS自动类型推断规则不包括这种情况,因此它不是一个编译器错误。您有时只需显式指定类型参数,或者将一些复杂的lambda提取到中间变量