簡體   English   中英

沒有實現接口的所有方法

[英]Not implementing all the methods of an interface

我嘗試在eclipse上復制下面的代碼。 我收到一個錯誤,告訴我必須實現所有繼承的方法(因為Comparator是一個接口)。

new Comparator(){}必須實現繼承的抽象方法Comparator.reversed()

有許多這些方法,我想要覆蓋的唯一方法是比較。 我是否必須實現所有其他方法,或者有沒有辦法指定我不需要實現它們? 知道由於接口的契約性質,我將不得不這樣做,但如果我只需要更改一個方法怎么辦?

static Map sortByValue(Map map) {
     List list = new LinkedList(map.entrySet());
     Collections.sort(list, new Comparator() {
          public int compare(Object o1, Object o2) {
               return ((Comparable) ((Map.Entry) (o1)).getValue())
              .compareTo(((Map.Entry) (o2)).getValue());
          }
     });

    Map result = new LinkedHashMap();
    for (Iterator it = list.iterator(); it.hasNext();) {
        Map.Entry entry = (Map.Entry)it.next();
        result.put(entry.getKey(), entry.getValue());
    }
    return result;
} 

編輯通過在eclipse luna中將合規性級別更改為java8來解決。 謝謝!

類型new Comparator(){}必須實現繼承的抽象方法Comparator.reversed()然后如果我應用修復,我添加了很多函數

Comparator.reversed是在Java 1.8中引入的,它是一個默認方法,即您不必覆蓋的方法。

看起來您已將您的合規性級別設置為Java 1.8之前(因為Eclipse要求您覆蓋reversed ),同時使用Java 1.8 API(因為Comparator具有reversed方法)。

確保將API更改為1.7將合規性級別更改為1.8 (后一種選擇需要Eclipse Luna或更好。)

有關Eclipse合規性級別的更多信息:Eclipse 中的“編譯器合規級別”是什么?

這是一個瘋狂的猜測:我認為你在Java 8-Eclipse之前使用Java 8(即pre-Luna)。 這樣,Eclipse就不知道所有那些新的Comparator方法(如thenComparing )都有默認實現。

在Java 7中 ,Comparator只有方法compare ,而在Java 8中有更多的方法,所有這些方法都直接在接口中有一個默認實現,不需要在子類中實現。

我建議你切換到Eclipse的最新版本,它應該是Luna。 或者,您也可以為Eclipse Kepler安裝補丁,但切換到Luna肯定更好。

接口的目的是強制所述接口的實現者擁有其中列出的所有方法。 現在有幾種方法可以實現不實現所有方法。

  1. 對於您不希望實現的每個方法(支持),只需拋出UnsupportedOperationException 這種實現的一個例子是Collections API

為了保持核心集合接口的數量可管理,Java平台不為每個集合類型的每個變體提供單獨的接口。 (這些變體可能包括不可變,固定大小和僅附加。)相反,每個接口中的修改操作都被指定為可選 - 給定的實現可以選擇不支持所有操作。 如果調用了不受支持的操作,則集合將拋出UnsupportedOperationException。 實現負責記錄它們支持哪些可選操作。 所有Java平台的通用實現都支持所有可選操作。

  1. 或者你可以按照Java開發人員對一些聲明很多方法的接口所做的事情,例如: MouseAdapter 這樣你就可以實現每個方法,但是它們不會做任何有用的事情。

抽象類可能更適合您正在做的事情。 雖然你可以只是.super()一切。

你遇到了一個Eclipse bug: https//bugs.eclipse.org/bugs/show_bug.cgi?id = 390889

基本上,JAVA 1.8引入了一種全新的方法Comparator.reversed()。 由於你有一個JAVA 1.7或更早的代碼,JAVA 1.8找不到該方法並且無法編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM