これが私の最初のコードです:
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あなたの方法を参照構文が間違っている-それは使用しません()
)