@SuppressWarnings("弃用")是否适用于不使用全部类的已弃用接口?

ccl*_*ark 5 java deprecated suppress-warnings deprecation-warning

我有一些遗留代码实现了不推荐使用的接口.这个特定的组件很快就会被弃用并自行删除,因此重构以解决编译器警告的根本原因是没有意义的.相反,我想压制它.但是,我不希望抑制的范围适用于整个班级.

代码最初是:

public class Foo 
  extends 
    Bar 
  implements 
    DeprecatedBaz, 
    Qux { ... }
Run Code Online (Sandbox Code Playgroud)

DeprecatedBaz是一个标记为@Deprecated的接口,是第三方框架,意味着我无法删除@Deprecated.我想抑制整个班级的警告而不是弃用.基本上我想写:

public class Foo
  extends 
    Bar 
  implements
    @SuppressWarnings("deprecation") 
    DeprecatedBaz, 
    Qux { ... }
Run Code Online (Sandbox Code Playgroud)

但是这是无效的语法,不解析.接下来我希望我能够在导入时做到这一点,但这个SO帖子似乎意味着它必须在课堂上完成.

或者,我认为可能将其应用于所有必须实现接口指令的方法可能会解决问题,但这也不起作用.

所以我似乎不得不在类级别应用注释:

@SuppressWarnings("deprecation")
public class Foo
  extends 
    Bar 
  implements 
    DeprecatedBaz, 
    Qux { ... }
Run Code Online (Sandbox Code Playgroud)

我不喜欢这样,因为如果某人编辑了这个类并引入了引用弃用代码的新代码,那么将会吞下警告.

在这种情况下,有没有办法限制范围?

Stu*_*rks 5

注释@SuppressWarnings只能在声明处使用。即使 Java 8 注释增强功能允许注释出现在其他语法位置,@SuppressWarnings在这种情况下,注释也不能用在您需要的地方,即子句中出现已弃用的接口的地方implements

您想要避免添加@SuppressWarnings类声明是正确的,因为这将抑制整个类中可能不相关的警告。

处理此问题的一种可能性是创建一个中间接口来扩展已弃用的接口,并抑制其上的警告。然后,将已弃用的接口的用途更改为子接口:

@SuppressWarnings("deprecation")
interface SubBaz extends DeprecatedBaz { }

public class Foo ... implements SubBaz ...
Run Code Online (Sandbox Code Playgroud)

这可以避免警告,因为类注释(在本例中为@Deprecated)不是继承的。