class Mynode{};
private JTree jt=new JTree();
DefaultMutableTreeNode dmtntemp=(DefaultMutableTreeNode)jt.getLastSelectedPathComponent();
MyNode mynode=(MyNode)dmtntemp.getUserObject();jt.getLastSelectedPathComponent()返回类型是Object,将其强制转换为DefaultMutableTreeNode类型,而Object是所有类的父类,这不是将父类转换为子类吗?为什么编译运行还是通过?同样道理,dmtntemp.getUserObject()返回类型也是Object,将其强制转换为Mynode类型,而Object是所有类的父类,这不是将父类转换为子类吗?为什么编译运行还是通过?请大家指教啊!
private JTree jt=new JTree();
DefaultMutableTreeNode dmtntemp=(DefaultMutableTreeNode)jt.getLastSelectedPathComponent();
MyNode mynode=(MyNode)dmtntemp.getUserObject();jt.getLastSelectedPathComponent()返回类型是Object,将其强制转换为DefaultMutableTreeNode类型,而Object是所有类的父类,这不是将父类转换为子类吗?为什么编译运行还是通过?同样道理,dmtntemp.getUserObject()返回类型也是Object,将其强制转换为Mynode类型,而Object是所有类的父类,这不是将父类转换为子类吗?为什么编译运行还是通过?请大家指教啊!
Class1 obj1 = (Class2)obj2;
编译能通过的原则是:
Class2是Class1的子类,和obj2是什么类的对象没关系。
运行时能通过的原则是:
obj2实质上是Class2(及其子类)的对象,和obj2声明为什么类的对象没有关系。
比如说:Object o = new Integer(123);
如果说你通过o这个变量(Object)来操作,是有限的,
但是你通过
Integer xx =(Integer)o;
这样通过强制转换为实际的类型(前提是你已经知道是这种类型),通过xx来操作,你就可以获取更多的操作了.
这里只是说它是Object类型的,也是Integer类型的,你可以把它当成Object来操作,也可以当成Integer来操作.你需要当成Integer类型来看,你就得先转成Integer,
但以下是不成立:
Object o = new String("134");Integer xx = (Integer)o;引用o实际引用的是String对象,你不能说想当成Integer就当成Integer来用.你可以Object o = new String("134");String xx = (String)o;
int i = Integer.purseInt(str);
这样也可以完成转换。类型转换只能是具有父子继承关系的对象之间转换,有向上类型转换,向下类型转换。
Person p = new Person();
Female f = new Female();
Person p1 = f;//向上
Female f1 = (Female)p;//向下