9

式をコンパイルしようとするとComparator.comparing(String::toLowerCase)、Java コンパイラがエラーを返します。詳細については、次の質問を参照してください。

Comparator.comparing が String::toLowerCase メソッド参照で機能しないのはなぜですか?


できるだけ問題を減らすように努めました。特に、他のクラスへのほとんどすべての依存関係を削除しました。メインメソッドには、2 つのメソッド呼び出しが含まれています。最初のステートメントはエラーなしでコンパイルされますが、2 番目のステートメントはエラーになります。

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; }
}

パラメータの数が一致しないため、2 番目のbazメソッドはこのコンテキストでは適用できないため、これは奇妙です。JLS8 (15.13) を見てきました。ただし、メソッド参照のルールは非常に複雑であるため、これは役に立ちませんでした。

Q: 2 番目のケースでコンパイル エラーが発生するのはなぜですか? 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
4

1 に答える 1