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提取到中间变量