gpt4 book ai didi

带有接口(interface)的 Java 编译错误

转载 作者:行者123 更新时间:2023-11-30 11:57:57 25 4
gpt4 key购买 nike

我在编译类时收到以下错误消息(减少到重要部分):

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 中不会。我用 sun 1.6.0icedtea6 1.8.1 试过了。

是否有明显的我遗漏的东西,或者是否有一个选项可以在 eclipse 中的某处设置以允许编译?问题是,现在我可以在 eclipse 中运行测试,但我无法在 eclipse 之外编译项目。


编辑:答案

似乎某些编译器版本在多重继承方面存在问题。解决方案是在继承自其他接口(interface)的子类中再次覆盖该方法,这些接口(interface)具有通用的超接口(interface)并且自己覆盖了该方法。

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

顺便说一句,这是菱形继承(钻石问题)。

最佳答案

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

如果接口(interface) A 扩展了接口(interface) B 和 C,并且 B 和 C 都具有具有相同签名 (doIt(String param1, int param2)) 的方法,则没有任何问题。但返回类型为 B#doItC#doIt应该兼容。如果B#doIt返回字符串和 C#doIt返回 int,那么我们不能将这两个方法组合在一个类中。

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

关于带有接口(interface)的 Java 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3463505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com