2016-11-12 8 views
1

のコンパレータとSerializableの間、私はここにJava8ビット単位とComparator.comparing

で実装Comparator.comparing方法のソースコードを探していますがComparator間のコード

public static <T, U> Comparator<T> comparing(
     Function<? super T, ? extends U> keyExtractor, 
     Comparator<? super U> keyComparator) 
{ 
    Objects.requireNonNull(keyExtractor); 
    Objects.requireNonNull(keyComparator); 
    return (Comparator<T> & Serializable) 
     (c1, c2) -> keyComparator.compare(keyExtractor.apply(c1), 
              keyExtractor.apply(c2)); 
} 

なぜビット単位andですSerializableが必要ですが、それは何ですか?

(Comparator<T> & Serializable) 

連鎖のために単にComparatorにキャストすることができます。

数字以外の値の場合でもビット単位の演算はどのように機能しますか?

ありがとうございました。

+1

関連:http://stackoverflow.com/questions/22819804/what-is-the-type-of-an-intersected-type – assylias

答えて

3

それはラムダ式に対応するタイプを生成するときに、このタイプの両方ComparatorSerializableインターフェースを実装する必要があり、コンパイラに示すタイプが、交差型間のビット演算ではありません。

2

この場合、単一の&はビット演算子ではありません。 Comparator AND Serializable型の共通部分です。あなたは戻り値の型がComparatorとSerializableの両方を実装したいと主張しています。ここでのトリックは、交差が1つの抽象メソッドのみになる限り、インターフェイスの交差をとることができることです。参照してください https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.16

ビット演算子(&、^、|)は、ブール値と数値型を比較す​​るために使用することができるが、それはここで何が起こっているかではありません。 https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.22