我有这样的代码:
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>
亲切的问候,
霸
答案 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
所述