-1
我下面一個約LAMBDA教程,在這裏我有這樣的接口:使用沒有定義它的方法?
@FunctionalInterface
public interface Comparator<T> {
public int compare(T t1, T t2); // What is this code???
public default Comparator<T> thenComparing(Comparator<T> cmp) {
return (p1, p2) -> compare(p1, p2) == 0 ? cmp.compare(p1, p2) : compare(p1, p2) ;
}
public default Comparator<T> thenComparing(Function<T, Comparable> f) {
return thenComparing(comparing(f)) ;
}
public static <U> Comparator<U> comparing(Function<U, Comparable> f) {
return (p1, p2) -> f.apply(p1).compareTo(f.apply(p2));
}
}
抽象方法比較(T1,T2)不被任何定義;然而,它在thenComparing(比較器cmp)方法中使用。這thenComparing方法然後用於下面的重載thenComparing()。但如果比較()沒有定義,這是什麼線的點:
return (p1, p2) -> compare(p1, p2) == 0 ? cmp.compare(p1, p2) : compare(p1, p2) ;
當你實際調用'thenComparing'時,'compare'總會被執行,因爲它只對一個實現類的具體實例有效...... –
'compare(t1,t2)''不是一個抽象方法,它是一個接口中的方法聲明。小的區別真的但重要的部分是實現接口的類不能被構造,直到所有的接口方法(除了所有的抽象方法之外)都被提供了一個定義,[見這個問題](http://stackoverflow.com/questions/) 11715485 /什麼,是最差報關和清式的Java間)。 –
@ KellyS.French - JLS指出接口中的非默認方法是一種抽象方法。看到我的答案。 –