mts*_*tsz 15 java eclipse compiler-construction generics 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);
}
}
Run Code Online (Sandbox Code Playgroud)
在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);
^
Run Code Online (Sandbox Code Playgroud)
此错误现在阻止在Maven中构建项目.由于Eclipse编译器构建得更宽容,我现在必须假设片段的定义和用法如上所述,静态方法是无效的Java?
Raf*_*ele 12
看来Sun的1.6 JDK无法推断出正确的类型.以下似乎适用于我的机器:
Set<Object> setOfObjects = Main.<Object, Integer>covariantSet(setOfInts);
Run Code Online (Sandbox Code Playgroud)
请注意,您必须调用前缀为类名的静态方法
Ale*_*exR 10
你是对的.这个问题确实存在.Eclipse不使用javac
.它使用自己的编译器.
实际上javac是"正确的".泛型是擦除.类型S
未包含在字节代码中,因此jvm在运行时没有足够的有关返回类型的信息.要解决此问题,请将方法原型更改为:
public static <S, T extends S> Set<S> covariantSet(Set<T> set, Class<S> returnType)
现在返回类型在运行时传递给方法,编译器不应该抱怨.