我有一个存储某些事件并发出克隆的类,但是Eclipse(我的IDE)给了我未经检查的克隆警告:
import java.util.*;
import java.awt.event.*;
public PlayerEvents {
private final ArrayList<KeyEvent> keyevents;
private final ArrayList<MouseEvent> mouseevents;
@SuppressWarnings("unchecked") // I have to do this to keep the IDE quiet
public PlayerEvents(ArrayList<KeyEvent> keyevents, ArrayList<MouseEvent> mouseevents) {
this.keyevents = (ArrayList<KeyEvent>) keyevents.clone(); // Type safety: Unchecked cast from Object to ArrayList<KeyEvent>
this.mouseevents = (ArrayList<MouseEvent>) mouseevents.clone(); // Type safety: Unchecked cast from Object to ArrayList<KeyEvent>
}
// More code...
}
克隆对象不何时才是其来源,即克隆的keyevent
何时不是keyevent
的类型?
编辑:此外,为什么.clone()对象会提供一个Object?这是否与Java语言的局限性有关?
我正在使用Eclipse Mars(4.5.2)和Java 1.8.0_91。
答案 0 :(得分:1)
ArrayList
会返回Object
类型。它将始终与ArrayList
的类型相同,但您仍需要进行投射。这是一种语法问题。
C.f。 ArrayList.clone()
关于你的第二个问题:是的,最初在Java方法中,返回值不能是共变量。您必须返回确切类型作为重写方法。因此,Object.clone()
只能返回类型Object
,这也是其重写方法必须执行的操作。
答案 1 :(得分:1)
这是因为在运行时期间,由于type ereasure,JVM无法确保clone method()将返回ArrayList<MouseEvent>
。
谈论克隆方法,您必须注意以下事项:
默认情况下,java克隆是“逐字段复制”,即作为对象 class没有关于clone()的类结构的想法 方法将被调用。因此,JVM在调用克隆时,请执行以下操作 事情:
1)如果类只有原始数据类型成员那么完全 将创建对象的新副本并引用新的 将返回对象副本。
2)如果类包含任何类类型的成员,那么只有 对这些成员的对象引用被复制,因此被复制 原始对象和克隆对象中的引用 引用同一个对象。
Here's the best clone explanation I've ever found. Quick and direct.