2010-08-11 48 views
2

錯誤我收到以下錯誤消息(降低到重要組成部分)當我編譯我的班:的Java編譯接口

reference to keySet is ambiguous, both method keySet() in 
java.util.SortedMap<E,capture#614 of ?> and method keySet() in 
test.ImmutableMap<E,capture#614 of ?> match 
    return map.keySet().iterator(); 
      ^

mapImmutableSortedMap<E, ?>類型的和一成不變的類長相的定義如:

public interface ImmutableMap<K, V> 
    extends Map<K, V> { 
    @Override 
    public ImmutableSet<K> keySet(); 
    ... 
} 
public interface ImmutableSortedMap<K, V> 
    extends ImmutableMap<K, V>, SortedMap<K, V> { 
    ... 
} 
public interface ImmutableSet<E> 
    extends Set<E> { 
    ... 
} 

當我使用ANT腳本或手動編譯時出現該錯誤,但不出現在eclipse中。 我試了sun 1.6.0 and iceiceda6 1.8.1

有沒有什麼明顯的我很想念,或者有一個選項,可以在日食設置的地方允許編譯? 問題是,現在,我可以在eclipse中運行測試,但是我無法在eclipse之外編譯項目。


編輯:答案

看來,一些編譯器版本有多重繼承這樣的問題。 解決方法是在從具有公共超級接口的其他接口繼承的子類中再次重寫該方法,並自行重寫該方法。

public interface ImmutableSortedMap<K, V> 
    extends ImmutableMap<K, V>, SortedMap<K, V> { 
    // adding this method solves the problem 
    @Override 
    public ImmutableSet<K> keySet(); 
} 

順便說一下,這是diamon問題。

回答

0

這兩個接口ImmutableMap和SortedMap都有一個名爲「keySet()」的方法,所以編譯器找不到需要調用的方法。在你的界面中更改方法的名稱;)

+0

如果方法匹配,那就不是問題。 – 2010-08-11 23:13:35

+0

而不是更改名稱,重新聲明子類中的方法解決了問題。 – Kru 2010-08-23 17:04:04

1

它在我看來,ImmutableMap#keySet有錯誤的返回類型。它應該是Set<K>ImmutableSet<K>
或者,如果您想返回一組配對,請改爲覆蓋Map#entrySet

如果interace A擴展了接口B和C,並且B和C都使用了相同簽名的方法(doIt(String param1, int param2)),那麼沒有任何問題。但是返回類型B#doItC#doIt應該是兼容的。如果B#doIt返回String並且C#doIt返回int,那麼我們不能在一個類中組合這兩個方法。

哦,不知道爲什麼它在Eclipse下編譯。

+0

我有與entrySet相同的錯誤,我打錯了方法的泛型類型。 (我糾正了這個問題) – Kru 2010-08-11 23:17:41

+0

@Chris然後,你提供的示例沒有什麼錯(除了你可以使用jdk的標準不可變包裝器)。你能展示keySet是如何實現的嗎? (它的聲明) – 2010-08-11 23:35:50

+0

我編輯了這個問題,它似乎是編譯器的問題,需要明確告訴ImmutableSortedMap中方法的簽名。 我不使用包裝,因爲創建一個新的不可變結構的成本只是一些修改過的元素的原始結構,需要整個結構的副本。這裏的實現並不相關,並且使用了很多其他函數......它放在這裏太大了。 – Kru 2010-08-12 16:16:30