Java:如何避免派生接口中的弃用警告覆盖不推荐使用的成员?

时间:2009-07-31 15:55:32

标签: java interface override deprecated

考虑以下简化的接口继承层次结构:

// Starting point:
public interface Base {
    void Foo();
}

public interface Derived extends Base {
}

旨在将Foo方法从Base接口移至Derived接口:

// Desired end-point:
public interface Base {
}

public interface Derived extends Base {
    void Foo();
}

为了逐步实现这种突破性变化,需要保留Base接口的向后兼容性一段时间。

这可以通过将Base界面上的方法标记为@Deprecated来实现:

// Intermediate state:
public interface Base {
    /**
     * @deprecated This method is deprecated as of release X. Derived.Foo should be used instead.
     */
    @Deprecated void Foo();
}

public interface Derived extends Base {
    void Foo(); 
}

编译此代码时,我收到 Derived 的编译器警告:

  

[弃用]接口Base中的Foo()已被弃用

奇怪的是,如果我从@deprecated中的文档中删除Base(但保留@Deprecated),则此警告会消失。

我收到此警告是否正确,如果是,我该如何处理?


警告似乎表明Derived.Foo正在“使用”Base.Foo(已弃用)。但Derived.Foo“使用”已弃用的Base.Foo的唯一容量是覆盖它。这似乎表明您不允许在派生方法中覆盖已弃用的接口方法。

如果是这种情况,我是否应该使用Derived修饰@SuppressWarnings("deprecation")以取消警告?

4 个答案:

答案 0 :(得分:10)

我相信您的要求是有效的,我毫不怀疑重写弃用的方法是正确的方法。

我认为@deprecated和@Deprecated之间的差异主要是历史性的。 @Deprecated是java 5中的官方方式,但是是新的,所以我们希望用@deprecated加倍。

还要注意,遗憾的是,@ Deprecated不允许您指定信息..虽然通常需要信息,例如告诉应该使用什么作为替换,或者预期弃用的方法被完全删除

不知道更多,知道问题会在你有效删除超级方法后立即消失,我会使用@SuppressWarnings(“弃用”),可能会对你的继任者的评论有所了解......(和另一个评论超级方法,告诉他们在删除方法时删除所有内容)。 ; - )

答案 1 :(得分:3)

如果我理解正确,你需要在类的开头实现不推荐的接口/函数的@SuppressWarnings(“弃用”)。还是我离开基地?

答案 2 :(得分:3)

如果你将@Deprecated添加到派生的Foo()声明中,我相信警告会消失。

public interface Derived extends Base {
    @Deprecated void Foo(); 
}

答案 3 :(得分:-1)

没有办法实现你想要的。

弃用是一种相对简单的机制,不支持此用例。

弃用的方式是引用已弃用的方法或字段的任何内容都会生成警告。

唯一的例外是如果不推荐使用弃用的方法/字段的代码。