假设我们有一个类
public class Entry<K, V> {
public Entry(K k,V v) {
mKey = k;
mValue = v;
}
public K getKey() {
return mKey;
}
public V getValue() {
return mValue;
}
...
}
然后我们编写一个扩展类,如下:
public class ExtendedEntry<K extends SomeSpecificKey, V> extends Entry<K, V>
接下来,层次结构中再加一个类:
public class ConcreteEntry<Option extends Something, K extends MoreSpecificKey<Option>, V> extends ExtendedEntry<K, V>
这里是关于更具体的键名
MoreSpecificKey
:public interface MoreSpecificKey<OptionType extends Something> extends SomeSpecificKey {
public void doSomething(OptionType option);
}
我在ConcreteEntry
的代码中某处使用了doSomething()
方法。
然后Eclipse编译器显示一切正常,构建代码并没有显示任何警告。
但是,javac
却响应:
...ConcreteEntry.java:6 types ...ExtendedEntry和...ExtendedEntry不兼容:它们都定义了getKey()方法,但返回类型不相关。
当我将MoreSpecificKey
更改为(删除泛型类型):
public interface MoreSpecificKey extends SomeSpecificKey {
public <OptionType extends Something> void doSomething(OptionType option);
}
ConcreteEntry
的定义如下:
public class ConcreteEntry<Option extends Something, K extends MoreSpecificKey, V> extends ExtendedEntry<K, V>
javac
的错误已经消失了,一切也都编译成功了。
那么,为什么Eclipse会像这样编译代码 - 是因为定义了任何编译器参数或不同的偏好,还是编译器之间存在差异。在使用Eclipse进行开发时如何处理(修复)这个问题,并确保它将在javac
中编译。
Entry
与其他任何东西的关系。我假设ExtendedEntry
是要扩展Entry
,但这在你发布的代码中并没有展示出来。 - Dave Costa