使用方法而不定义它?

时间:2017-04-12 13:45:46

标签: java

我正在关注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) ;

1 个答案:

答案 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;