在方法中使用@SuppressWarnings会生成编译错误

时间:2015-05-14 07:53:51

标签: java generics compiler-errors

我有以下代码块:

     final Map<String, Double> map;
            if (cond) {
                int currency = 44;
                @SuppressWarnings("unchecked")
                map = (Map<String, Double>)objectA.get();
            }else {
                map= ....}
get()的{​​{1}}方法返回原始objectA(我知道在那里使用泛型会很好,我的问题会解决,但我无法更改该类的代码)。如果我删除HashMap行,显然我会收到@SuppressWarnings("unchecked")警告。但是当我在行中添加正确的低压警告时,我得到以下错误:

TypeSafety

有人能解释我为什么吗?

2 个答案:

答案 0 :(得分:6)

编译器认为@SuppressWarnings("unchecked")是一个表达式,并且没有终端运算符;。但是,如果添加它,表达式无效。

您必须在变量定义之前注释方法使用注释:

@SuppressWarnings("unchecked") 
public void method() {
    @SuppressWarnings("unchecked") final Map<String, Double> map;
    if (cond) {
        int currency = 44;
        map = (Map<String, Double>)objectA.get();
    }
}

请注意,javadoc表示:

  

作为一种风格问题,程序员应该始终在最有效的嵌套元素上使用此注释。

答案 1 :(得分:0)

在Java中,Local Variable Declaration Statement可以注释。其他类型的语句不能。

您的代码显示expression statement(作业表达式):

@SuppressWarnings("unchecked")
map = (Map<String, Double>)objectA.get();

这不能注释。您可能从如下所示的本地变量声明语句开始,然后将Map<String, Double>类型移到if语句之外:

@SuppressWarnings("unchecked")
Map<String, Double> map = (Map<String, Double>)objectA.get();

如果Java解析器看到方法中的注释(或类型声明,但现在忽略它),它实际上会期望一个局部变量声明语句。 这样的语句总是以一个类型开头,这就是错误告诉你的:map不是有效类型。

(请注意,如果map是有效类型,则会抱怨您未在=之前指定标识符。)