【问题标题】:Is it an eclipse or maven-compiler-plugin bug, the generics Class cast issue?是 eclipse 还是 maven-compiler-plugin 错误,泛型类转换问题?
【发布时间】:2018-01-09 18:58:05
【问题描述】:

我有这样的代码:

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

我在 TestCase 类中使用:

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

这段代码在eclipse中给出警告

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

此行有多个标记
- 类型安全: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
必需: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>

亲切的问候,
暴君

【问题讨论】:

    标签: eclipse generics maven-plugin javac jls


    【解决方案1】:

    这是 Eclipse 中的一个已知错误:333011: [compiler][1.5] Eclipse compiles codes which javac rejects: incompatible types。随意为该错误投票并将您的用例添加到其中。


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

    【讨论】:

    • 我和我的一位同事进行了讨论,他认为 eclipse 编译器只是比 maven 编译器“更聪明”,并且可以注意到 Class clazz = MyClass.class;是 MyClass 类型,因为在表达式的右侧我们有一个简单的语句。我想说要么应该更改 java 规范以适应这种行为,要么 eclipse 编译器不应该这样做 - 它会给其他编译器带来问题。对吗?
    • 事实上,Java 语言规范是一成不变的。一旦编写了编译器,就必须遵守它。我同意智能编译器可以推断出比 javac 和 eclipsec 目前所做的更多的事情,但这会使其不兼容 - 无用。在这个特定的例子中,eclipse 编译器是不兼容的,应该被修复。另一个注意事项:它不是 maven 编译器,它是 maven-compiler-plugin,它在后台调用 javac,所以比较的是 eclipsec 和 javac。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-03
        • 2017-04-18
        • 1970-01-01
        • 2017-05-24
        • 1970-01-01
        • 2021-02-07
        • 2014-12-09
        相关资源
        最近更新 更多