可以在调用`clone()`时避免未经检查的转换吗?

问题描述 投票:0回答:1

这是一个人为设计的示例,用于说明问题。我知道有些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不能做到的吗?

这是一个人为设计的示例,用于说明问题。我知道有一些方法可以避免生成编译器警告,您也可以禁用该警告。我想知道是否有可能...

java casting compiler-warnings
1个回答
0
投票
是的,这是设计使然。
© www.soinside.com 2019 - 2024. All rights reserved.