Java:克隆前输入类型?

时间:2017-04-04 10:34:48

标签: java clone

编辑:当我需要克隆一个对象时,我遇到了这个问题,我已经搜索过,但没有问题可以解决我的问题。

当我在Java中学习原型模式时,我遵循了一些教程并对(Bike)super.clone()的类型转换感到困惑。

首先完成哪项? (Bike)supersuper.clone()?为什么需要(Bike)

public interface Prototype extends Cloneable
{
    public Prototype clone() throws CloneNotSupportedException;
}

public class Bike implements Prototype
{
    // Constructor and other methods...

    // My question is here
    public Prototype clone() throws CloneNotSupportedException {
        return (Bike)super.clone();
    }
}

3 个答案:

答案 0 :(得分:2)

首先执行类super.clone(),然后使用(Bike)投射结果(​​强制转换应用于后面的表达式的结果)。

您需要强制转换,因为您要覆盖Object#clone(),它可以追溯到pre-generics JDK1.0并且返回类型为Object

答案 1 :(得分:2)

演员表的优先级低于函数调用:

(Foo) a.f1().f2().f3() // Casts to Foo at the end of the calls chain

在你的情况下,演员是必要的,因为你正在调用super.clone(),这是一个继承自Object.clone()的方法,返回Object

答案 2 :(得分:1)

由于Prototype是自行车的超类,当调用super.clone()时,会返回一个克隆的对象,然后将其显式地转换为Prototype的一个更具体的子类,即Bike。

需要进行类型转换以满足Bike类的要求。 更一般的观点是,创建的每个对象都将Object类作为其超类,但也具有用户定义的方法,这些方法未在超类(Object类)中定义。键入将其强制转换为子类后,可以从同一对象

访问父方法和子方法