gjo*_*anv 5 java javac java-11
假设您有一个带有已弃用的构造函数的参数化类,以及一个User调用此构造函数的类。在下面的示例中,使用菱形运算符,javac(版本 11.0.11)不会生成弃用警告:
class DepTester<T> {
T t;
@Deprecated
public DepTester(T t) {
this.t = t;
}
}
class User {
DepTester<String> tester = new DepTester<>("This does not produce a warning!");
}
Run Code Online (Sandbox Code Playgroud)
但是,如果在构造函数调用中使用显式类型参数,则会发出警告:
class User {
DepTester<String> tester = new DepTester<String>("This produces a warning.");
}
[WARNING] DepTester.java:[17,40] DepTester(T) in com.foo.DepTester has been deprecated
Run Code Online (Sandbox Code Playgroud)
通常不包含显式类型参数,IntelliJ 检查也会对此发出警告:
显式类型参数 String 可以替换为 <>
我在Java 语言规范中找不到这种行为的解释。我尝试使用 javac 17,它在两种情况下都会产生警告,那么这是 javac 11 中的错误吗?
编辑:我向 Oracle 提交的错误报告在 Java 错误数据库中分配了一个 ID:JDK-8281107
您遇到错误JDK-8257037, \xe2\x80\x9c 使用 Diamond\xe2\x80\x9d 调用已弃用的构造函数时没有 javac 警告:
\n\n\n当编译使用菱形语法指定泛型类型时调用已弃用构造函数的类时,不会发出弃用警告。使用显式类型参数或原始类型调用同一构造函数时,会发出弃用警告。
\n
它已通过 JDK\xc2\xa017 修复。
\n\n\n\xe2\x80\x99s 还报告向后移植到 JDK\xc2\xa016,但对于早期版本没有报告。