您的位置:首页 > 其它

向下转型安全否?

2016-06-30 15:38 344 查看
向下转型到底安全吗?看看代码先:

public interface IFather {
public abstract void sayHello();
}
public interface Ison extends IFather {
public abstract void dance();
}
public class Father implements IFather {
public void sayHello() {
System.out.println("father sayHello..............");
}
}
public class Son implements Ison {
public void sayHello() {
System.out.println("son sayhello..............");
}

public void dance() {
System.out.println("son dance............");
}
}
public class Test {
public static void main(String[] args) {

IFather f1=new Son();
((Ison)f1).dance();//正常运行

IFather f2=new Father();
((Ison)f2).dance();//这里会报错 java.lang.ClassCastException
System.out.println("========");
}
}
f1和f2都是IFather类型,为什么f2向下转型的时候会报错而f1不会?

原因很简单,f1虽然声明成IFather类型,但是作为对象它的实际类型却是Son,所以调用dance()的时候没有问题。而f2是名副其实的IFather,强转调用ISon的dance()方法自然就报错了。所以向下转型是否安全取决于对象的实际类型,不应该根据声明类型就立即判断转换是绝对不安全的。比如servlet中HttpServletRequestWrapper类中的_getHttpServletRequest方法中就有所谓的向下转型,要知道HttpServletRequest是ServletRequest的子接口类型,但实际运行中也并不会出错,道理和上面的例子是一样的。

public class ServletRequestWrapper implements ServletRequest
{
private ServletRequest request;
public ServletRequest getRequest()
{
return this.request;
}
........
}
public class HttpServletRequestWrapper extends ServletRequestWrapper implements HttpServletRequest
{
private HttpServletRequest _getHttpServletRequest() {
return ((HttpServletRequest)super.getRequest());
}
................
}

最后一句话总结一下:对象向下转型到底安不安全取决于对象的实际类型而不是声明类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息