2010-08-11 54 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