Java:Eclipse和javac在处理泛型时有所不同

3

假设我们有一个类

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中编译。


1
你没有展示Entry与其他任何东西的关系。我假设ExtendedEntry是要扩展Entry,但这在你发布的代码中并没有展示出来。 - Dave Costa
是的,你说得对,我现在会修复它。 - shaman.sir
1个回答

4

是的,有一种选项可以使用jconsole-Dcom.sun.management.jmxremote来监视它的构建方式。我现在会尝试一下。 - shaman.sir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接