В настоящее время я переносю проект в 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>
Кто-нибудь знает, почему это может происходить?
Некоторые конкретные детали реализации были запутаны.