为什么在使用参数化类型的已弃用构造函数时 javac 不产生警告?
Why doesn't javac produce a warning when using a deprecated constructor of a parameterized type?
假设您有一个参数化的 class 和一个已弃用的构造函数,以及一个调用此构造函数的 User
class。在下面的示例中,使用菱形运算符,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!");
}
但是,在构造函数调用中使用显式类型参数时,会发出警告:
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
通常不包括显式类型参数,IntelliJ 检查也会警告:
Explicit type argument String can be replaced with <>
我在 Java language spec 中找不到对此行为的解释。我尝试使用 javac 17,它在两种情况下都会产生警告,这是 javac 11 中的错误吗?
编辑:我向 Oracle 提交的错误报告在 Java 错误数据库中分配了一个 ID:JDK-8281107
您遇到错误 JDK-8257037,“使用 diamond 调用已弃用的构造函数时没有 javac 警告”:
No deprecation warning is emitted when compiling a class that calls a deprecated constructor when using the diamond syntax to specify the generic types. A deprecation warning is emitted when calling the same constructor using an explicit type argument or a raw type.
已通过 JDK17 修复。
还有一个报告 backport to JDK 16,但早期版本 none。
假设您有一个参数化的 class 和一个已弃用的构造函数,以及一个调用此构造函数的 User
class。在下面的示例中,使用菱形运算符,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!");
}
但是,在构造函数调用中使用显式类型参数时,会发出警告:
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
通常不包括显式类型参数,IntelliJ 检查也会警告:
Explicit type argument String can be replaced with <>
我在 Java language spec 中找不到对此行为的解释。我尝试使用 javac 17,它在两种情况下都会产生警告,这是 javac 11 中的错误吗?
编辑:我向 Oracle 提交的错误报告在 Java 错误数据库中分配了一个 ID:JDK-8281107
您遇到错误 JDK-8257037,“使用 diamond 调用已弃用的构造函数时没有 javac 警告”:
No deprecation warning is emitted when compiling a class that calls a deprecated constructor when using the diamond syntax to specify the generic types. A deprecation warning is emitted when calling the same constructor using an explicit type argument or a raw type.
已通过 JDK17 修复。
还有一个报告 backport to JDK 16,但早期版本 none。