それはインターフェースの静的メソッドとメソッドのリファレンスを使用することは可能ですか?

Adryr83:

これが私の最初のコードです:

public class MethodReference {
    public static void main (String []args) {
        Stream<String> s = Stream.of("brown bear", "grizzly");
        s.sorted(Comparator.reverseOrder()).forEach(System.out::print);
        //...
    }
}

結果:grizzlybrownクマ

これは私の第二のコードです:

public class MethodReference {
    public static void main (String []args) {
        Stream<String> s = Stream.of("brown bear", "grizzly");
        s.sorted(Comparator::reverseOrder()).forEach(System.out::print);
        //...
    }
}

結果:コンパイラエラー

私の質問:なぜ、第二のコードでコンパイルエラーはありますか?私は、機能インタフェースの静的メソッドのためのメソッド参照を使用することはできませんか?

私は、機能インタフェースのデフォルトのメソッドとメソッドのリファレンスを使用することはできません知っています。私は5例では、クラスとメソッドのリファレンスを使用することができます知っています:

クラス

  • クラス:: staticMethod

  • クラス:: instanceMethod

  • インスタンス:: instanceMethod

  • クラス::新しいです

機能インタフェース

  • インターフェイス:: abstractMethod

どうもありがとう!

マイケル:

Comparator.reverseOrder()その解決される式であるComparatorことは、それが返すものですので、タイプ。

Comparator::reverseOrder式があるためにどのの解決方法引数を取らず、戻りComparator例えば、AをSupplier<Comparator<String>>、それが任意のマッチング機能インターフェースであってもよいが、。

番目のインスタンスでは、(提供方法を渡そうとしているComparatorの引数として)。この方法はそれを望んでいない-それはちょうど望んでいるComparator自分自身。

あなたは(ポイントを実証するだけで擬似コード)それはこのように考えることができます:

s.sorted(new Comparator())

s.sorted(new Supplier(new Comparator()))

それはインターフェースの静的メソッドのためのメソッド参照を使用するように、これまでは可能ですかどうかについてのあなたの2番目の質問に答えるために - はい、絶対に!

なら、私たちは、次のメソッドを宣言します。

<T> void giveMeAComparatorSupplier(Supplier<Comparator<T>> supplier) { }

その後、我々は間違いなく、メソッドを参照して、それを呼び出すことができます

giveMeAComparatorSupplier(Comparator::reverseOrder);

(そして、FYIあなたの方法を参照構文が間違っている-それは使用しません()

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=222379&siteId=1