Java 为什么可以';是否将此lambda表达式自动浇铸/热盒发送给供应商?

Java 为什么可以';是否将此lambda表达式自动浇铸/热盒发送给供应商?,java,eclipse,lambda,java-8,supplier,Java,Eclipse,Lambda,Java 8,Supplier,调用参数为供应商的函数时。。。根据需要输入lambdas。我应用了以下错误并阻止ide(EclipseOxygen)构建项目 内部编译器错误:java.lang.UnsupportedOperationException:no glb for[public abstract class java.lang.Number 父方法类似于 Foo foo1; Foo foo2; public < O > O run( Function< Foo, O > func ){

调用参数为供应商的函数时。。。根据需要输入lambdas。我应用了以下错误并阻止ide(EclipseOxygen)构建项目

内部编译器错误:java.lang.UnsupportedOperationException:no glb for[public abstract class java.lang.Number

父方法类似于

Foo foo1;
Foo foo2;

public < O > O run( Function< Foo, O > func ){
    if( func == null )
        return null;
    return firstNotNull( () -> func.apply( foo1 ),
                         () -> func.apply( foo2 ) );
}
Foo-foo1;
富富2;
公共O运行(函数func){
如果(func==null)
返回null;
返回firstNotNull(()->func.apply(foo1),
()->函数应用(foo2));
}
和child方法:

@SafeVarargs
公共静态finalO firstNotNull(供应商…函数){
对于(供应商职能:职能){
O obj=函数get();
如果(obj!=null)
返回obj;
}
返回null;
}
回到给出的错误,类中没有提到类号;但是一个核心java类在编译时给出了错误

但是,在编辑父对象时

publicO运行(函数func){
如果(func==null)
返回null;
返回firstNotNull((供应商)()->函数应用(foo1),
(供应商)()->职能申请(foo2));
}
错误
不再发生,IDE成功构建并符合要求。我写这篇文章是因为我在网上找不到类似的文章,除了建议从eclipse中删除损坏的构建器,这对这个问题的变体不起作用;因此我将此日志记录下来,以帮助其他有类似问题的开发人员

我还想知道发生了什么错误以及为什么会发生

p.S.我注意到这只是在java从
8.0\u 144
更新到
8.0\u 151
之后才成为一个问题

更新:


我已经将java版本从8u151更改为8u152,并尝试了9,错误仍然存在于该工作区中。但是,我在eclipse中创建了一个新项目来重新创建错误,我没有成功,即使我更改了java版本。结论:eclipse似乎抛出了错误,java Builder和Spring project Builder都抛出了相同的错误。

Obvio编译器中的错误,如错误文本“Internal compiler error”所示。报告错误。如果是我,我会尝试在没有IDE的情况下从命令行编译,使用版本
8.0_151
。此外,目前还有
8.0_152
可用。您不需要比较3个不同版本的输出…错误
“没有glb用于…”
可能由Eclipse引发,但我无法使用给定的代码片段进行复制。首先,不清楚超级父级和子级是什么意思,但我假设这只是与调用层次结构有关(?)我把这两个方法放在同一个类中。第二,标识符foo1,foo2是未声明的。如果我添加了这个名称的方法参数并发明了一个空类Foo,那么javac和ecj很乐意接受这个程序。第三,如果在Eclipse中跟踪一个bug,请告诉我们版本你试过了。@StephanHerrmann-第一点-用法当我给它们贴上super和child标签时,我指的是调用层次结构,我会尽量弄清楚。第二点:foo1和foo2是类字段;我已将它们添加到代码段中。第三点:eclipse-Version:Oxygen.1a发行版(4.7.1a)构建id:20171005-1200I仍然无法重现Eclipse 4.7.1a的问题。您可能需要检查是否存在此问题。否则,显示错误的完整项目压缩文件可能有助于查找原因(将其附加到位于的新错误报告)。显然,编译器中存在错误,如错误文本“Internal compiler error”所示。报告错误。如果是我,我会尝试在没有IDE的情况下从命令行编译,使用版本
8.0_151
。此外,目前还有
8.0_152
可用。您不需要比较3个不同版本的输出…错误
“没有glb用于…”
可能由Eclipse引发,但我无法使用给定的代码片段进行复制。首先,不清楚超级父级和子级是什么意思,但我假设这只是与调用层次结构有关(?)我把这两个方法放在同一个类中。第二,标识符foo1,foo2是未声明的。如果我添加了这个名称的方法参数并发明了一个空类Foo,那么javac和ecj很乐意接受这个程序。第三,如果在Eclipse中跟踪一个bug,请告诉我们版本你试过了。@StephanHerrmann-第一点-用法当我给它们贴上super和child标签时,我指的是调用层次结构,我会尽量弄清楚。第二点:foo1和foo2是类字段;我已将它们添加到代码段中。第三点:eclipse-Version:Oxygen.1a发行版(4.7.1a)构建id:20171005-1200I仍然无法重现Eclipse 4.7.1a的问题。您可能需要检查是否存在此问题。否则,显示错误的完整项目zip可能有助于找到原因(将其附加到位于的新错误报告中)。
@SafeVarargs
public static final < O > O firstNotNull( Supplier< O >... funcs ){
    for( Supplier< O > func : funcs ){
        O obj = func.get();
        if( obj != null )
            return obj;
    }
    return null;
}
public < O > O run( Function< Foo, O > func ){
    if( func == null )
        return null;
    return firstNotNull( (Supplier< O >) () -> func.apply( foo1 ),
                         (Supplier< O >) () -> func.apply( foo2 ) );
}