我有两个向量声明为私有类属性:
private Vector<Myobject> v1 = new Vector<Myobject>();
private Vector<Myobject> v2 = new Vector<Myobject>();
我用一堆Myobjects填充v1。
我需要做一个v1到v2的浅层克隆。我试过了:
v2 = v1.clone();
我得到“未经检查或不安全的操作”。
我尝试过各种形式的施法,似乎无法克服这种警告。
即使我删除第二个(v2)声明并尝试克隆:
Vector<Myobject> v2 = v1.clone();
或
Vector<Myobject> v2 = ( Vector<Myobject> ) v1.clone();
......还是明白了。
我确定我在这里遗漏了一些非常基本的东西......
提前致谢
答案 0 :(得分:5)
在将非参数化类型(例如Object
返回的clone()
)转换为参数化类型时,编译器将始终发出警告。这是因为目标类型Vector<Myobject>
不仅要保证自身,还要保证其中包含的对象。但是,由于类型参数信息已被删除,因此无法在运行时验证这些保证。
See here for a a more detailed explanation.
如前所述,如果您只是想复制矢量v1,那么正确的方法就是使用复制构造函数。
Vector<Myobject> v2 = new Vector<Myobject>(v1);
生成的克隆将很浅,因为它只会将Myobject
引用从v1复制到v2。
答案 1 :(得分:3)
请尝试使用复制构造函数:
Vector<Myobject> v2 = new Vector<Myobject>(v1);
答案 2 :(得分:2)
有时,作为程序员,您知道警告不是问题,但是没有办法仅通过修改代码来说服编译器。这就是为什么它是警告而不是错误。
在这些情况下,您可以在作业上方添加SuppressWarnings
注释:
@SuppressWarnings("unchecked")
Vector<Myobject> v2 = (Vector<Myobject>) v1.clone();