【问题标题】:why java compiler doesn't report unchecked cast warnings for multi-cast expression in Intellij?为什么 java 编译器不报告 Intellij 中多播表达式的未经检查的强制转换警告?
【发布时间】:2017-07-01 05:03:04
【问题描述】:

由于Supplier<R> & SerializableT 的超类型,为什么下面的代码没有通过jdk 1.8.0_121 报告Intellij IDEA 的未经检查的警告?

<T extends Supplier<Integer> & Serializable> T createdBy(AtomicInteger counter) {
    //      v--- if I removed the first cast expression, I can't compile it
    return (T) (Supplier<Integer> & Serializable) counter::incrementAndGet;
    //           ^--- it should be reports unchecked warnings, but it doesn't

}

以下代码报告了未经检查的强制转换警告:

<T, R extends T> R apply(T value) {
    return (R) value;
    //      ^--- unchecked cast 
}

为什么会出现这个问题,感兴趣的事情发生在我在下面编写代码以链接具有多个超类型的类型时:

AtomicInteger counter  = new AtomicInteger(0);
Supplier<Integer>  serialized = serialized(createdBy(counter));

assert serialized.get() == 1; // ok
assert counter.get() == 0 ; // ok

<T extends Serializable> T serialized(T value) {
    return deserialize(serialize(value));
}

我已经通过 JLS 进行了搜索,但我找不到确切有利的证据。谁能告诉我为什么?

【问题讨论】:

  • @EJP incrementAndGet 方法由AtomicInteger 定义,并且方法签名已更改。对不起,我英语不好。也许我糟糕的英语让你感到困惑。但我的意图很明显。我只是想知道为什么,先生?问题来自于我编写一些测试来验证函数并且使用的变量都在 apache spark 中序列化。
  • @holi-java 关于这个:(T) (Supplier&lt;Integer&gt; &amp; Serializable) counter::incrementAndGet; 你在用什么编译器?我试过javac 8 build 131javac 9 build 175;和最新的 eclipse 编译器,它们每个都发布警告
  • @Eugene 首先,感谢您的测试。我从不以命令方式测试它。我正在使用带有jdk 1.8.0_121 的 Intellij IDEA,没有报告任何未经检查的强制转换警告。而且我发现我本地的 jdk 也报告了未经检查的强制转换警告。为什么?
  • @Eugene 是的,先生。 :)。我刚才已经测试过了。我确定我使用了相同的jdk。并且在 intellij 中也启用了 -Xlint 选项,但它没有报告任何警告。
  • @holi-java 是 - eclipse 确实报告了警告

标签: java generics intellij-idea java-8


【解决方案1】:

在 IntelliJ IDEA 中,为了让 java 编译器报告未经检查的警告,您需要将 -Xlint:unchecked 选项添加到 Java Compiler |附加命令行参数:

如果您尝试使用命令行javac 编译它,它也不会向您报告警告本身,但会告诉您如何启用未经检查的警告:

Note: Main.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

如果未指定此选项,IntelliJ IDEA 将显示相同的消息:

添加-Xlint:unchecked 选项后,输出将变为:

Information:javac 1.8.0_121 was used to compile java sources
Information:01.07.2017 16:07 - Compilation completed successfully with 1 warning in 2s 553ms
D:\work\attaches\unchecked\src\Main.java
    Warning:Warning:line (9)java: unchecked cast
  required: T
  found:    java.lang.Object&java.util.function.Supplier<java.lang.Integer>&java.io.Serializable

如您所见,IntelliJ IDEA 的行为与命令行 javac 完全相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2012-06-26
    • 1970-01-01
    相关资源
    最近更新 更多