为什么 javac 在使用参数化类型的已弃用构造函数时不产生警告?

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

Hol*_*ger 6

您遇到错误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,但对于早期版本没有报告。

\n

  • 我认为向后移植到 JDK 11 会很有用。但请注意,您也可以使用 JDK 17 来编译 JDK 11。 (2认同)