Я пытаюсь перенести некоторые старые приложения, которые используют библиотеки Java 8, на 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 in unbound lookup)
Сценарий выглядит следующим образом:
MyOldLib.java (в проекте Java 8)
public class MyOldLib {
public static String getId(BasicDBObject o) { return o.getString("id"); }
}
MyMigratingApplication.java (в проекте Java 11)
public class MyMigratingApplication {
public static void main(String[] args) {
List<BasicDBObject> myList = getDataFromSomewhere();
List<String> myIdList = myList.stream().map(MyOldLib::getId).collect(Collectors.toList());
//...
}
}
Использование ссылки на метод, как было сделано, не работает, но если я вместо этого использую лямбду или инкапсулирую метод getId
, он работает:
Использование лямбды:
public class MyMigratingApplication {
public static void main(String[] args) {
List<BasicDBObject> myList = getDataFromSomewhere();
List<String> myIdList = myList.stream().map(data -> MyOldLib.getId(data)).collect(Collectors.toList());
//...
}
}
Инкапсуляция:
public class MyMigratingApplication {
static String getId(BasicDBObject data) {
return MyOldLib.getId(data)
}
public static void main(String[] args) {
List<BasicDBObject> myList = getDataFromSomewhere();
List<String> myIdList = myList.stream().map(MyMigratingApplication::getId).collect(Collectors.toList());
//...
}
}
Почемуэто происходит? Есть ли какое-либо решение, которое минимизирует потребности рефакторинга кода?
Дополнительная информация:
1) Версия MongoDB одинакова для обоих проектов, 3.6.4.
2)Это происходит, когда я пытаюсь запустить приложение в IntelliJ IDE.
3) Я использую Maven в качестве менеджера зависимостей.