Javagenerics在Eclipse中编译,但不在javac中编译

我必须发现我的项目中有Java代码,它在Eclipse中编译并运行良好,但在javac中抛出了编译错误。

一个独立的片段:

import java.util.HashSet; import java.util.Set; public class Main { public static void main(String[] args) { Set setOfInts = new HashSet(); Set setOfObjects = covariantSet(setOfInts); } public static  Set covariantSet(Set set) { return new HashSet(set); } } 

javac中的编译返回:

 Main.java:10: incompatible types found : java.util.Set required: java.util.Set Set setOfObjects = covariantSet(setOfInts); ^ 

此错误现在阻止在Maven中构建项目。 由于Eclipse编译器构建得更宽容,我现在必须假设片段的定义和用法如上所述静态方法是无效的Java?

看来Sun的1.6 JDK无法推断出正确的类型。 以下似乎适用于我的机器:

 Set setOfObjects = Main.covariantSet(setOfInts); 

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

你是对的。 这个问题确实存在。 Eclipse不使用javac 。 它使用自己的编译器。

实际上javac是“正确的”。 generics是擦除。 类型S未包含在字节代码中,因此jvm在运行时没有足够的有关返回类型的信息。 要解决此问题,请将方法原型更改为:

public static Set covariantSet(Set set, Class returnType)

现在返回类型在运行时传递给方法,编译器不应该抱怨。

在你的Maven构建skript中,你已经设置了编译器版本。

在Ant中,它看起来像这样:

  

搜索1.3或1.4,或编译以在maven skripts中找到该值

值为1.5时,编译器将接受generics(请参阅错误消息)

我知道这是一个老问题,但我想提一下,该函数可以写成:

 import java.util.HashSet; import java.util.Set; public class Main { public static void main(String[] args) { Set setOfInts = new HashSet(); Set setOfObjects = covariantSet(setOfInts); } public static  Set covariantSet(Set set) { return new HashSet(set); } } 

它有点清洁,您可以完全按照您的意图使用该function(使用隐式generics键入)。

将下一个插件添加到pom.xml:

  maven-compiler-plugin 2.3.2  1.6 1.6