代码之家  ›  专栏  ›  技术社区  ›  Kru

Java编译接口错误

  •  2
  • Kru  · 技术社区  · 15 年前

    我收到以下错误消息 (简化为重要部分)

    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();
                  ^
    

    map 属于类型 ImmutableSortedMap<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中不会出现。 我试过了 icedtea6 1.8.1版 .

    是否有明显的遗漏,或者是否有一个选项可以在eclipse中的某个地方设置以允许编译? 问题是,现在,我可以在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();
    }
    

    顺便说一下,这就是戴蒙问题。

    2 回复  |  直到 15 年前
        1
  •  0
  •   Aymen    15 年前

        2
  •  1
  •   Nikita Rybak    15 年前

    在我看来, ImmutableMap#keySet 返回类型错误。应该是的 Set<K> ImmutableSet<K> .
    或者,如果要返回一组对,请重写 Map#entrySet 相反。

    如果interace A扩展了接口B和C,并且B和C都有具有相同签名的方法,则没有问题( doIt(String param1, int param2) B#doIt C#doIt 干得漂亮 返回字符串和 返回int,则不能在一个类中组合这两个方法。

    哦,不知道它为什么在Eclipse下编译。