-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指出接口中的非默认方法是一种抽象方法。看到我的答案。 –