最近同事调的一个服务报错,查看后是日期之间转换出的问题。代码里是把 java.sql.Date 类型的对象 强制转换为 java.sql.Timestamp 类型的对象。报java.lang.ClassCastException。
代码:
java.sql.Date date = new java.sql.Date(2011,9,15);
Timestamp ts = (Timestamp)date;
这样的代码根据就编译不过。因为查看Java的Api,会发现 java.sql.Timestamp 继承 java.util.Date,同样 java.sql.Date 也继承 java.util.Date 。两个没有继承关系的类对象是不能进行转换的。
解决办法:
java.sql.Date date = new java.sql.Date(2011,9,15);
Timestamp ts = new Timestamp(date.getTime());
借此也想深入研究一下Java的父类与子类之间转换的问题。
例子: 父类:
public class ParentClass {
private String privateStr = "privateStr var";
public String publicStr = "publicStr var";
public String sayHello(){
return "hello , this is a parentclass's function";
}
}
子类:
public class ChildClass extends ParentClass {
private String inStr = "hello icepeter";
public String outStr = "hello everyone";
public String goHome(){
return "go home!";
}
}
测试类:
public class Test {
public static void main(String[] args) {
//测试一:子类转父类
ParentClass pc1 = new ChildClass(); //上溯造型
System.out.println(pc1.publicStr);
//System.out.println(pc1.privateStr); 访问父类里的私有变量出错
System.out.println(pc1.sayHello());
//System.out.println(pc1.goHome()); 访问子类里的公有方法出错
//System.out.println(pc1.outStr); 访问子类的变量出错
//测试二:父类转子类
//第1种情况 会抛出 java.lang.ClassCastException:
ParentClass pc2 = new ParentClass();
ChildClass cc2 = (ChildClass) pc2; //这里必须强制类型转换 //下溯造型
System.out.println(cc2.publicStr);
System.out.println(cc2.outStr);
System.out.println(cc2.sayHello());
System.out.println(cc2.goHome());
//第2种情况
ChildClass ccS = new ChildClass();
ParentClass pc3 = ccS;
ChildClass cc3 = (ChildClass) pc3; //这里必须强制类型转换 //下溯造型
System.out.println(cc3.publicStr);
System.out.println(cc3.outStr);
System.out.println(cc3.sayHello());
System.out.println(cc3.goHome());
}
}
总结:
如果一个对象与另一个对象没有任何的继承关系,那么他们就不能进行类型转换。如果要把一个派生类对象赋值给基类对象这个称为上溯造型。如果要把基类对象赋值给派生类对象就需要强制类型转换,这称为下溯造型,下溯造型有一些危险,要安全的进行下溯造型有一个前题,基类对象必须是从派生类对象中上溯过来的。