假设您有一个带有不推荐使用的构造函数的参数化类,以及一个调用此构造函数的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!");
}

但是,如果构造函数调用中有显式类型参数,则会发出警告:

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 inspection还警告:

显式类型参数字符串可以替换为&lt&gt;

我在Java language spec米中找不到对这种行为的解释.我try 使用javac 17,它在两种情况下都会产生警告,那么这是javac 11中的bug吗?

编辑:我向Oracle提交的错误报告在Java错误数据库中分配了一个ID:JDK-8281107

推荐答案

您遇到错误JDK-8257037,"使用菱形调用已弃用的构造函数时没有javac警告":

在编译使用菱形语法指定泛型类型时调用已弃用构造函数的类时,不会发出弃用警告.当使用显式类型参数或原始类型调用同一构造函数时,会发出弃用警告.

It has been fixed with JDK 17.
There’s also a reported backport to JDK 16, but none for earlier versions.

Java相关问答推荐

Spring Jpa findById会导致StackOverFlow错误,但其他查询没有问题

如何在Docker容器中使用wireock—Webhooks阻止请求?

尽管类型擦除,instanceof与泛型在Java中如何工作?

为什么我的ArrayList索引的索引总是返回-1?

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

当返回Mono<;Something>;时,不会调用Mono<;void>;.flatMap

具有阻塞方法的开源库是否应该为执行提供异步选项?

使用Jolt将字段转换为列表

使用PDFBox从PDF中删除图像

如何在一行中使用Dijkstra中的Java Stream

如果按钮符合某些期望,如何修改它的文本?

根本不显示JavaFX阿拉伯字母

Android应用程序为错误的显示类型 Select 尺寸文件

将stringBuilder + forloop转换为stream + map

Java.time.OffsetDateTime的SQL Server数据库列类型是什么?

在权限列表中找不到我的应用程序

如何在Java中的重写方法参数中强制(Enum)接口实现?

保持标题窗格的箭头可见,即使设置为不可折叠

如何用Micrometer&;斯普肯

放置在变量中的Java成员引用不相等