这是jdk1.5一个已经报告的bug:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103041
问题在于在jdk1.5中Timestamp多定义了一个比较方法:
public int compareTo(java.util.Date o) {
return compareTo((Timestamp)o);
}
这样如楼主所说,在1.4中Timestamp.compareTo(Date)的时候会调用继承来的Date.compareTo(Date)方法来完成比较,而Date.compareTo(Date)在比较前会把参数造型成Date对象,因此可以完成比较;而在1.5中Timestamp则直接使用自己的Timestamp.compareTo(Date)方法来比较,并试图在其中把参数造型成Timestamp,因此抛出造型异常。
但是这并不像楼主想像的,“Generics也会带来一些其他的问题”,而是sun有意为之。看上面这个compareTo方法的相关说明:
// This forwarding method ensures that the compareTo(Date) method defined
// in java.util.Date is not invoked on a Timestamp
显然sun认为1.4中的做法是不对的,下定决心在以放弃兼容性为代价在1.5中更正这个错误,而不是一个bug(真的要修复这个bug的话只要把上面这个方法删掉就行了)。sun坚持的正好就是楼主说的原则问题:只比较具有相同类型的两个对象
放弃兼容性的代价就是有一些在1.4下面正常的代码在1.5下面不能允许了,包括大名鼎鼎的JIRA。对此JIRA的反应是:
JDK 1.5 has a bug that prevents JIRA from processing mail correctly. Until the issue is resolved, JIRA does not support JDK 1.5. We recommend you use JDK 1.4.x but it is possible to continue with JDK 1.5 by restarting the server with option \'-Dallow.jdk.1.5=true\'. You can find the JDK bug at http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103041
可是JIRA想要等“issue is resolved”那一天恐怕等不着了,这是个原则问题嘛 :)