Невозможно скомпилировать ссылку на метод в JDK 11 - PullRequest
1 голос
/ 22 марта 2019

В настоящее время я переносю проект в JDK 11 и компилирую его с Maven. Тем не менее, Maven бросает колебание по одной ссылке на метод (у него нет проблем в другом месте). Рассматриваемый метод выглядит следующим образом:

public class MyThing {

    boolean something = true;

    // ...

    public boolean isSomething() {
        return something;
    }

    // ...
}

И вызов вышеупомянутого метода выглядит примерно так:

return methodThatGetsOptionalDefinition(aString)                 // Optional<Definition>
        .map(definition -> defenition.getMyThing(anotherString)) // Optional<MyThing>
        .map(MyThing::isSomething)                               // Optional<Boolean>
        .orElse(true);

При компиляции Maven выдает следующее сообщение:

> mvn clean install -Pdist-snapshot -DskipTests
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project XXXXX: Compilation failure
[ERROR] /D:/XXXXX.java:[63,38] incompatible types: invalid method reference
[ERROR]     method isSomething in class XXXXX.MyThing cannot be applied to given types
[ERROR]       required: no arguments
[ERROR]       found: java.lang.Object
[ERROR]       reason: actual and formal argument lists differ in length
[ERROR]
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.

Если развернуть ссылку на метод следующим образом, она без проблем скомпилируется:

return methodThatGetsOptionalDefinition(aString)
        .map(definition -> defenition.getMyThing(anotherString))
        .map(myThing -> myThing.isSomething())
        .orElse(true);

Набор опциональных также работает:

return methodThatGetsOptionalDefinition(aString)
        .<MyThing>map(definition -> defenition.getMyThing(anotherString))
        .map(myThing -> myThing.isSomething())
        .orElse(true);

Та же ошибка возникает при компиляции проекта с использованием IntelliJ с обеими версиями Open JDK 11.0.1 и 11.0.2. По иронии судьбы, IntelliJ жалуется, что «лямбда может быть заменена ссылкой на метод». Проблема также возникает при использовании другого «языкового режима».

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>11</source>
        <target>11</target>
    </configuration>
</plugin>

Кто-нибудь знает, почему это может происходить?

Некоторые конкретные детали реализации были запутаны.

...