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

Is it safe to assign an object of type java.sql.Date to a variable of java.util.Date?

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

由于 java.sql.Date 扩展了 java.util.Date,像这样在 bean 中设置我们从 DB 层获取的 java.sql.Date 对象是否安全?

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

代码编译得很好。

不安全。即使 java.sql.Date extends java.util.Date,它也不是正确的 sub-type,因为它不是行为子类型。下面的示例显示了这两种类型的不同行为:

// 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 的情况好多了。