向下转型安全否?
2016-06-30 15:38
344 查看
向下转型到底安全吗?看看代码先:
原因很简单,f1虽然声明成IFather类型,但是作为对象它的实际类型却是Son,所以调用dance()的时候没有问题。而f2是名副其实的IFather,强转调用ISon的dance()方法自然就报错了。所以向下转型是否安全取决于对象的实际类型,不应该根据声明类型就立即判断转换是绝对不安全的。比如servlet中HttpServletRequestWrapper类中的_getHttpServletRequest方法中就有所谓的向下转型,要知道HttpServletRequest是ServletRequest的子接口类型,但实际运行中也并不会出错,道理和上面的例子是一样的。
最后一句话总结一下:对象向下转型到底安不安全取决于对象的实际类型而不是声明类型。
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()); } ................ }
最后一句话总结一下:对象向下转型到底安不安全取决于对象的实际类型而不是声明类型。
相关文章推荐
- Java的【向上转型】和【向下转型】
- 外观类??为了代码的安全调用
- 向下转型
- java 向上转型(upcasting)和向下转型(downcasting)区别举例详解
- Java 父类引用指向子类对象
- JAVA多态学习2
- 【java】java中向上转型和向下转型相关知识
- Java向上转型和向下转型(附详细例子)
- Java中的向上转型和向下转型
- 关于Java继承的 向上转型和向下转型
- 第八章 多态(下)
- c++中向上转型(安全)和向下转型(不安全)
- Java中的向上转型和向下转型
- 多态使用中对象是向上转型或是向下转型的区别
- 接口回调 类向上转型 向下转型 (java)
- 重新认识java(五) ---- 面向对象之多态(向上转型与向下转型)
- Java4Android笔记之Java中的对象的转型
- java向上转型和向下转型
- java向上转型和向下转型
- 向上转型和向下转型