这是一个人为设计的示例,用于说明问题。我知道有些ways around this不会生成编译器警告,您也可以禁用该警告。我想知道如果没有这些技巧,这是否有可能。
给出此代码:
1 public static void main(String[] args) {
2 Map<String,String> map = null;
3
4 HashMap<String,String> hmap;
5
6 if(map instanceof HashMap)
7 hmap = (HashMap<String,String>)map;
8 else
9 hmap = new HashMap<String,String>(map);
10
11 map = (Map<String,String>)hmap.clone();
12
13 Object o = hmap.clone();
14 if(o instanceof Map<?,?>)
15 map = (Map<String,String>)o;
16 }
第11行和第15行的代码都会生成编译器警告:Unchecked cast from Object to Map<String,String>
第11行有点理解:克隆将是一个Object.clone()
返回一个Object
,并且在转换之前没有instanceof
检查。程序员知道
Map<String,String>
,但是编译器无法证明它。不过,第15行让我感到困惑。通常,使用instanceof
检查变量的类型,然后立即对其进行强制转换将不会生成此类警告。实际上,用这样的非参数化类替换代码将不会在这些代码行中产生任何警告:static class A {}
static class B extends A implements Cloneable {
public Object clone() { return null; }
}
public static void main(String[] args) {
A a = null;
B b;
if(a instanceof B)
b = (B)a;
else
b = new B();
a = (A)b.clone();
Object o = b.clone();
if(o instanceof A)
a = (A)o;
}
返回原始代码(带有Map<String,String>
引用),即使将此笨拙的构造添加到代码的末尾也会产生类似的警告:
map = (Map<String,String>)hmap.getClass().cast(o);
这次的警告是Unchecked cast from capture#11-of ? extends HashMap to Map<String,String>
。尝试写:
map = HashMap<String,String>.class.cast(o);
生成编译器,因为它无法确定错误
HashMap<String,String>.class
是静态类引用的方式与例如HashMap.class
,因此我们必须使用“正确”类型的引用来调用Class.cast
。这是Java不能做到的吗?这是一个人为设计的示例,用于说明问题。我知道有一些方法可以避免生成编译器警告,您也可以禁用该警告。我想知道是否有可能...