从Java 8迁移到Java 11时方法引用出现问题
我试图将一些使用Java 8 libs的旧应用程序迁移到Java 11,但使用方法引用的代码出现了一些奇怪的情况:从Java 8迁移到Java 11时方法引用出现问题,java,java-11,method-reference,Java,Java 11,Method Reference,我试图将一些使用Java 8 libs的旧应用程序迁移到Java 11,但使用方法引用的代码出现了一些奇怪的情况: Error:(26, 46) java: incompatible types: cannot infer type-variable(s) R (argument mismatch; invalid method reference unexpected static method getId(com.mongodb.BasicDBObject) found
Error:(26, 46) java: incompatible types: cannot infer type-variable(s) R
(argument mismatch; invalid method reference
unexpected static method getId(com.mongodb.BasicDBObject) found in unbound lookup)
场景如下所示:
myollib.java(在Java8项目中)
公共类myollib{
公共静态字符串getId(BasicDBObject o){return o.getString(“id”);}
}
MyMigratingApplication.java(在java 11项目上)
公共类MyMigratingApplication{
公共静态void main(字符串[]args){
List myList=getdatafromwhere();
List myIdList=myList.stream().map(myollib::getId).collect(Collectors.toList());
//...
}
}
按原样使用方法引用不起作用,但如果我使用lambda或封装getId
方法,它确实起作用:
使用lambda:
公共类MyMigratingApplication{
公共静态void main(字符串[]args){
List myList=getdatafromwhere();
List myIdList=myList.stream().map(data->myollib.getId(data)).collect(collector.toList());
//...
}
}
封装:
公共类MyMigratingApplication{
静态字符串getId(基本CDBObObject数据){
返回myollib.getId(数据)
}
公共静态void main(字符串[]args){
List myList=getdatafromwhere();
List myIdList=myList.stream().map(MyMigratingApplication::getId).collect(Collectors.toList());
//...
}
}
为什么会这样?有没有什么解决方案可以最小化代码重构需求
一些传统信息:
1) MongoDB版本在两个项目上都是相同的,即3.6.4
2) 当我尝试在IntelliJ IDE上运行应用程序时会发生这种情况
3) 我使用Maven作为依赖项管理器。它在JDK-13上运行良好。您正在使用哪个版本的
IntelliJ
?这样封装块下的代码将无法工作MyMigratingApplication::getId(data)
,您可以将其更改为MyMigratingApplication::getId
我正在使用IntelliJ Ultimate 2019.2.3 IDEA是否使用Java 8预构建的旧项目?您是否尝试过使用File->Invalidate caches?maven clean compile是否也会出现同样的错误?