编辑:当我需要克隆一个对象时,我遇到了这个问题,我已经搜索过,但没有问题可以解决我的问题。
当我在Java中学习原型模式时,我遵循了一些教程并对(Bike)super.clone()
的类型转换感到困惑。
首先完成哪项? (Bike)super
或super.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();
}
}
答案 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类)中定义。键入将其强制转换为子类后,可以从同一对象
访问父方法和子方法