我有以下代码块:
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
有人能解释我为什么吗?
答案 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
是有效类型,则会抱怨您未在=
之前指定标识符。)