它是一个eclipse或maven-compiler-plugin bug,泛型Class cast问题?

时间:2011-04-12 09:57:12

标签: eclipse generics maven-plugin javac jls

我有这样的代码:

protected <T> T doSomething(String someParam, Class<T> clazz) {
...
}

我在TestCase类中使用:

Class clazz = MyClass.class;
MyClass MyClass = someObject.doSomething(someString, clazz);

此代码在eclipse中发出警告

  

Class是原始类型。对泛型类的引用应该参数化

  

此行的多个标记
       - 类型安全:未经检查的调用doSomething(String,Class)的通用方法doSomething(String,Class)类型为MyClass
       - 类型安全:类型Class的表达式需要未经检查的转换以符合Class

当我在eclipse中运行此代码(测试)时 - 一切都运行良好。当我通过“mvn clean install”通过命令提示符执行此操作时,我得到:

  

C:\ pathToProject \ src \ test \ java \ packagesPath \ MyTestCase.java:[xx,xxx]找到不兼容的类型:
  java.lang.Object继承
  必需:com.somePackagePath.MyClass

但是在提供时:

Class<MyClass> clazz = MyClass.class;
MyClass MyClass = someObject.doSomething(someString, clazz);

我没有任何错误或警告。
我理解java编译器erases type info,所以:
eclipse不应该提供编译器错误而不是警告,还是maven-plugin-compiler会产生问题?
maven插件是:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
                <showDeprecation>false</showDeprecation>
                <debug>true</debug>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>

亲切的问候,

3 个答案:

答案 0 :(得分:3)

这是Eclipse中的已知错误:333011: [compiler][1.5] Eclipse compiles codes which javac rejects: incompatible types。随意投票给bug并添加你的用例。


有些情况javac和Eclipse不同意,您应该将它们报告为错误。最好有一个尽可能少的Java文件的独立测试用例,可以在Eclipse中进行复制/粘贴,并使用命令行中的javac进行编译,没有任何依赖关系。

答案 1 :(得分:0)

您使用的是哪种编译器? 在这种情况下http://code.google.com/p/jclouds/issues/detail?id=461 openjdk似乎揭示了不兼容的类型,而sun jdk忽略它并编译。

答案 2 :(得分:0)

解决方法是在maven中使用eclipse编译器,如Using Eclipse Java Compiler (ecj) in maven builds

所述