覆盖方法的弃用

Ste*_* S. 8 java eclipse deprecated deprecation-warning

我在Eclipse IDE中发现了一些奇怪的东西.假设我有以下课程:

public class Super {
    @Deprecated
    public void doNotUseThisMethod() {
        // do magic
    }
}

public class Sub extends Super{
    @Override
    public void doNotUseThisMethod() {
        // why is this not deprecated?
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,覆盖已弃用的方法应该会产生警告(因为不使用它的原因相同).仍然在Eclipse Luna和Mars的全新工作区中,上面的代码根本不会产生警告.我也找不到任何方法来启用它.

我发现这个接口的错误(我知道如果Super是一个接口,应该没有警告),这意味着曾经有一个警告.

所以发生了什么事?是否有任何理由覆盖已弃用的方法不应导致警告?我可以做些什么来重新启用此功能吗?

Eri*_*rom 5

JLS在这一点上非常明确(因为它在大多数点上都是如此).

注释@Deprecated的程序元素是程序员不鼓励使用的程序元素,通常是因为它很危险,或者因为存在更好的替代方案.

当声明使用@Deprecated注释的类型,方法,字段或构造函数在显式或隐式声明的构造中使用(覆盖,调用或通过名称引用)时,Java编译器必须生成弃用警告,除非:

  • 使用在一个实体内,该实体本身用注释@Deprecated注释; 要么

  • 该用法位于注释为使用注释@SuppressWarnings("deprecation")抑制警告的实体内; 要么

  • 使用和声明都在同一个最外层.

(https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.6.4.6)

为了完全符合JLS,Eclipse 必须标记您doNotUseThisMethod()的警告.很久以前它似乎曾经这样做过,但在2003年出现了bug 48335并且该警告受到偏好的影响.默认情况下,如错误评论中所述,是"禁用".(默认应该"启用"甚至可以远程兼容JLS.随意提交一个错误来改变它.)我没有进行详尽的搜索,但是因为你看到的行为与此一致,我'我要走出去,说这是从那以后一直如此.

由于它是一种偏好,你可以改变它.只需转到"Window - > Preferences",然后选择"Java - > Compiler - > Errors/Warnings".向下滚动到"已弃用且受限制的API",然后选中"信号覆盖或实施弃用方法"旁边的框.右侧有一个下拉菜单,略高于您可以选择"错误","警告"或"忽略"的位置.选择您喜欢的那个.

该设置仅影响您的本地IDE.

要使整个团队使用该设置,您需要设置项目特定设置.在同一个首选项屏幕上,右上角有一个"配置项目特定设置"的链接.单击它,选择要为其设置首选项的项目,并执行上述相同操作.这将在项目的".settings"文件夹中创建名为"org.eclipse.jdt.core.prefs"的文件.(您无法在Package Explorer中看到它们.您需要在Navigator视图中查看它们.)创建后,您可以将它们添加到源代码管理中,它们将适用于您团队中的每个人项目.

是的,你必须为每个项目做到这一点.