Java泛型可在Eclipse中编译,但不能在javac中编译


问题内容

我不得不发现我的项目中有Java代码,该代码可以在Eclipse中编译并正常运行,但是会在javac中引发编译错误。

一个完整的代码段:

import java.util.HashSet;
import java.util.Set;

public class Main {

    public static void main(String[] args) {
    Set<Integer> setOfInts = new HashSet<Integer>();
    Set<Object> setOfObjects = covariantSet(setOfInts);
    }

    public static <S, T extends S> Set<S> covariantSet(Set<T> set) {
    return new HashSet<S>(set);
    }

}

javac中的编译返回:

Main.java:10: incompatible types
found   : java.util.Set<java.lang.Integer>
required: java.util.Set<java.lang.Object>
    Set<Object> setOfObjects = covariantSet(setOfInts);
                                           ^

现在,此错误阻止在Maven中构建项目。由于Eclipse编译器具有更高的容忍度,因此我现在不得不假设代码段的定义和用法如上所述,静态方法不是有效的Java吗?


问题答案:

似乎Sun的1.6 JDK无法推断正确的类型。以下内容似乎可以在我的机器上运行:

Set<Object> setOfObjects = Main.<Object, Integer>covariantSet(setOfInts);

请注意,您必须调用以类名为前缀的静态方法