比如如下代码:
public class T extends A,implements Cloneable
{
……
public Object clone() throws CloneNotSupportedException
{
T cloned = (T)super.clone();
……
return cloned;
}
}T cloned = (T)super.clone() 怎么会成功呢?向下转型不是只在用基类引用指向子类对象时才能临时向下转型为子类引用吗?
我实在不明白,虽然API文档中也这样写 “按照惯例,返回的对象应该通过调用 super.clone 获得。”
public class T extends A,implements Cloneable
{
……
public Object clone() throws CloneNotSupportedException
{
T cloned = (T)super.clone();
……
return cloned;
}
}T cloned = (T)super.clone() 怎么会成功呢?向下转型不是只在用基类引用指向子类对象时才能临时向下转型为子类引用吗?
我实在不明白,虽然API文档中也这样写 “按照惯例,返回的对象应该通过调用 super.clone 获得。”
为什么呢?比方说 A 里面有 string a,T里面有string t。
那么A和T的clone方法,你会怎么写呢?
显然,A的clone是 A a1 = new A(); a1 = A.a; return a1;
然后,T的clone里面首先调用父类的clone,把a clone好,然后再clone T自己的属性t。当然,如果A的clone函数不返回 new A(),而是返回一个不相关的 new B(); T不从B继承,那么就会有ClassCastException了。
T cloned = (T)super.clone();
这条语句不会产生ClassCastException异常?
根据语法规则,它不产生异常那就很奇怪啊
因为,test.a = test.t;的时候吧a赋值成t,所以后面就可以正常的执行test.t = (T) test.a;把a强制转换为T并赋还给t。
当然你执行一下if(test.a instanceof T)可以返回true的。
你原来的问题,super的问题,super调用自己的父类实体,当然这个实体是可以强制转换为自己所属的类型的。public class Test {
T t;
A a;
public static void main(String []strs){
Test test = new Test(); test.a = test.t;
test.t = (T) test.a;
}
public Test(){
t = new T();
a = new A();
} public class A {
}
public class T extends A {
}
}上面的代码,把test.a = test.t;和test.t = (T) test.a;反过来:
先test.t = (T) test.a,再test.a = test.t,就ClassCastException,因为a不是T,无法强制转换。