为什么在使用参数化类型的已弃用构造函数时 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。