将java.sql.Date类型的对象分配给java.util.Date的变量是否安全?

时间:2016-01-20 19:09:29

标签: java sql datetime java-7

在我们的数据库访问层中,我们使用数据类型java.sql.Date来表示DATE列,而在我们的bean中,我们正在使用java.util.Date(它是一个遗留应用程序)。

由于java.sql.Date扩展java.util.Date,如果只设置我们从bean中的数据库层获取的java.sql.Date对象是否安全?

java.sql.Date sqlDate;
// bean.setValidFrom(java.util.Date validFrom)
bean.setValidFrom(sqlDate);

代码编译得很好。

1 个答案:

答案 0 :(得分:3)

不安全。即使java.sql.Date extends java.util.Date,它也不是一个合适的子类型,因为它不是一个行为子类型。这是一个示例,显示了两种类型的行为方式:

// not really a date, but a Date
Date date1 = new Date(0L);                                   
// really a date, but not a Date
java.sql.Date sqlDate = java.sql.Date.valueOf("1970-01-01"); 
// really a date, but a Date?
Date date2 = sqlDate;                                        
// a Date with time
date1.getHours();                                            
// a Date without time. <-- throws an IllegalArgumentException. 
// Wait, exactly *which* argument is illegal?
date2.getHours();                                            

您应该创建一个java.util.Date类型的新对象,复制值如下:

java.sql.Date dateFromDb;
bean.setValidFrom(new java.util.Date(dateFromDb.getTime()));

幸运的是,使用Java 8,事情变得更好了。