为什么java编译器不报告Intellij中多播表达式的未经检查的强制转换警告?
为什么下面的代码没有报告Intellij IDEA与jdk 1.8.0_121
未经检查的警告,因为Supplier & Serializable
是T
的超类型?
<T extends Supplier & Serializable> T createdBy(AtomicInteger counter) { // v--- if I removed the first cast expression, I can't compile it return (T) (Supplier & Serializable) counter::incrementAndGet; // ^--- it should be reports unchecked warnings, but it doesn't }
并且以下代码报告了未经检查的强制转换警告:
R apply(T value) { return (R) value; // ^--- unchecked cast }
为什么会出现这个问题,感兴趣的事情发生在我编写下面的代码以链接具有多个超类型的类型时:
AtomicInteger counter = new AtomicInteger(0); Supplier serialized = serialized(createdBy(counter)); assert serialized.get() == 1; // ok assert counter.get() == 0 ; // ok T serialized(T value) { return deserialize(serialize(value)); }
我搜索过JLS,但我找不到确切有利的证据。 有人能告诉我为什么吗?
在IntelliJ IDEA中,java编译器报告未经检查的警告,您需要在Java编译器中添加-Xlint:unchecked
选项。 其他命令行参数:
如果您尝试使用命令行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.io.Serializable
如您所见,IntelliJ IDEA的行为与命令行javac
完全相同。