什么时候克隆不是原始对象的类型?

时间:2016-05-17 00:22:41

标签: java clone compiler-warnings

我有一个存储某些事件并发出克隆的类,但是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。

2 个答案:

答案 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.