@Deprecated对方法参数和局部变量的意义是什么?

ada*_*shr 10 java deprecated

免责声明:我知道的意思和目的@Deprecated.

@Deprecated注释的定义在Java的源代码中如下所示:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
Run Code Online (Sandbox Code Playgroud)

我理解为目标值的目的CONSTRUCTOR,FIELD,TYPE,METHODPACKAGE.

但是,将方法参数或局部变量标记为什么意味着什么@Deprecated

奇怪的是,以下示例编译时没有任何警告.

interface Doable {
    void doIt(@Deprecated Object input);
}

class Action implements Doable {

    @Override
    public void doIt(@Deprecated Object input) {

        String string = String.valueOf(input); // no warning!

        @Deprecated
        String localVariable = "hello";

        System.out.println("Am I using a deprecated variable?" + localVariable); // no warning!
    }
}
Run Code Online (Sandbox Code Playgroud)

这是他们将来打算实施的东西吗?


FWIW,我在Ubuntu 12.04 64bit上使用JDK 1.7.0_11.无论我是从Eclipse还是命令行运行程序,结果都是一样的.

编译器确实吐出了正常使用的警告@Deprecated,例如使用该类的一个不推荐的构造函数java.util.Date.只是为了证明我没有错误的终端或设置,这是输出:

$ javac com/adarshr/Test.java -Xlint:deprecation
com/adarshr/Test.java:12: warning: [deprecation] Date(int,int,int) in Date has been deprecated
        new Date(2013, 1, 31);
        ^
1 warning
$ 
$ javac -version
javac 1.7.0_11
Run Code Online (Sandbox Code Playgroud)

Mat*_*all 7

将方法参数或局部变量标记为什么意味着什么@Deprecated

与应用于任何其他元素时的含义相同:

注释的程序元素@Deprecated是程序员不鼓励使用的程序元素,通常因为它是危险的,或者因为存在更好的替代方案.当在不推荐使用的代码中使用或覆盖已弃用的程序元素时,编译器会发出警告.


为什么编译器不会在Java 7中省略对已弃用的参数和字段的警告?
因为这正是JLS(第9.6.3.6节)规定的内容.

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

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

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

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

@Deprecated在局部变量声明或参数声明上使用注释无效.

(重点补充)

  • @adarshr在JLS中找到它`:)` (3认同)