Java:泛型在Eclipse和javac中处理不同

时间:2010-11-09 12:48:06

标签: java eclipse generics

说我们有课

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);
}

我在doSomething()的代码中使用了ConcreteEntry方法。

然后Eclipse编译器说OK并构建代码并且没有显示警告。

javac回复:

  

... ConcreteEntry.java:6类型... 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 个答案:

答案 0 :(得分:4)

部分问题已在问题Where does Eclipse find javac to compile a project?中解释 - Eclipse使用不同的编译器