При попытке скомпилировать выражение Comparator.comparing(String::toLowerCase)
компилятор Java возвращает ошибку. См. следующий вопрос для получения дополнительной информации:
Почему Comparator.comparing не работает с методом String::toLowerCase ссылка?
Я постарался максимально уменьшить проблему. В частности, я убрал почти все зависимости от других классов. Метод main содержит два вызова метода. Первый оператор компилируется без ошибок, тогда как второй оператор выдает ошибку.
interface Fun<T, R> { R apply(T t); }
public final class Foo {
public static void main(String... args) {
invoke(Foo::bar); // OK
invoke(Foo::baz); // ERROR
}
private static <T, U> void invoke(Fun<T, U> f) { }
private String bar() { return null; }
private String baz() { return null; }
private String baz(Integer i, Integer j) { return null; }
}
Это странно, потому что второй метод baz не должен применяться в данном контексте из-за несовпадения количества параметров. Я взглянул на JLS8 (15.13). Однако это не помогло, потому что правила для ссылок на методы довольно сложны.
Вопрос. Почему возникает ошибка компиляции во втором случае? Должна ли действительно быть ошибка компиляции в соответствии с JLS? Согласно некоторым комментариям по другому вопросу, в Netbeans нет ошибки компиляции.
Для справки, я использую JDK8 версии 1.8.0-b132. Если скомпилировать программу в командной строке, компилятор показывает следующее сообщение об ошибке:
$ /opt/jdk8/bin/javac Foo.java
Foo.java:6: error: incompatible types: cannot infer type-variable(s) T,U
invoke(Foo::baz); // ERROR
^
(argument mismatch; invalid method reference
no suitable method found for baz(Object)
method Foo.baz() is not applicable
(actual and formal argument lists differ in length)
method Foo.baz(Integer,Integer) is not applicable
(actual and formal argument lists differ in length))
where T,U are type-variables:
T extends Object declared in method <T,U>invoke(Fun<T,U>)
U extends Object declared in method <T,U>invoke(Fun<T,U>)
Foo.java:6: error: invalid method reference
invoke(Foo::baz); // ERROR
^
non-static method baz() cannot be referenced from a static context
2 errors