Проблема со ссылками на методы при миграции с Java 8 на Java 11 - PullRequest
2 голосов
/ 11 октября 2019

Я пытаюсь перенести некоторые старые приложения, которые используют библиотеки 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 в качестве менеджера зависимостей.

...