我正在关注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));
}
}
抽象方法compare(t1,t2)没有在任何地方定义;但是,它用于thenComparing(比较器cmp)方法。然后,这个比较方法用于下面的重载thenComparing()。但是如果没有定义compare(),那么这一行的重点是什么:
return (p1, p2) -> compare(p1, p2) == 0 ? cmp.compare(p1, p2) : compare(p1, p2) ;
答案 0 :(得分:0)
以下是与您的问题相关的界面部分:
@FunctionalInterface
public interface Comparator<T> {
public int compare(T t1, T t2);
public default Comparator<T> thenComparing(Comparator<T> cmp) {
return (p1, p2) -> compare(p1, p2) == 0 ?
cmp.compare(p1, p2) : compare(p1, p2) ;
}
// rest deleted ...
}
首先,public int compare(T t1, T t2);
语句声明抽象方法 1 。任何具体(即非抽象,可实例化)类都必须具有此方法的实现。 Java编译器坚持这一点,JVM的类加载器也是如此。
方法thenComparing
是默认的实例方法。这意味着将使用this
调用它,该List
引用实现this
的某个类的实例。但是,通过前一段,这意味着this.compare(T, T)
对象必须具有compare(p1, p2)
的实现。这是PerchXMLTag::create()
来电中使用的方法。
1 - JLS声明(9.4):&#34;缺少默认修饰符或静态修饰符的接口方法是隐式抽象的,因此它的主体用分号表示,不是块。允许但不鼓励作为样式,为这种方法声明冗余地指定抽象修饰符。&#34;