3

我有这样的代码:

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

我在 TestCase 类中使用:

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

此代码在 eclipse 中给出警告

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

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

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

C:\pathToProject\src\test\java\packagesPath\MyTestCase.java:[xx,xxx] 发现不兼容的类型:
java.lang.Object
required: com.somePackagePath.MyClass

但是在提供时:

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

我没有收到任何错误或警告。.
我知道 java 编译器会删除类型 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>

亲切的问候,
暴君

4

3 回答 3

3

这是 Eclipse 中的一个已知错误:333011: [compiler][1.5] Eclipse 编译 javac 拒绝的代码:不兼容类型。随意为该错误投票并将您的用例添加到其中。


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

于 2011-04-12T10:04:05.347 回答
0

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

于 2011-05-14T13:42:54.747 回答
0

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

于 2017-08-03T10:39:16.227 回答