我真的想喜歡仿製藥,但到目前爲止,他們已經勝過任何利益造成的麻煩。請告訴我我錯了。鑄造一個可比,然後比較
我理解增加@SuppressWarnings的必要性(「未登記」)使用無通用的框架時(春,休眠)。這一點確實降低了泛型的價值,正如要求將類傳遞給構造函數以避免刪除的缺陷一樣。然而,真正的刺總是似乎在鑄造。我通常會嘗試一段時間以獲得正確的語法,但是放棄純粹的嘗試,添加@SuppressWarnings,並繼續我的生活。
這裏有一個例子:我反映了一個bean來尋找兩個實例之間的差異。一些屬性實現Comparable,使得(a.equals(b)== false)但(a.compareTo(b)== 0)(例如BigDecimal,Date)。在這些情況下,我希望該財產被視爲相同。
MyObject original = getOriginal();
MyObject updated = getUpdated();
for (PropertyDescriptor pd : BeanUtils.getPropertyDescriptors(MyObject.class)) {
// Assume I'm putting in the try/catch block
Object pOriginal = pd.getReadMethod().invoke(original, (Object[]) null);
Object pUpdated = pd.getReadMethod().invoke(updated, (Object[]) null);
boolean isPropertySame;
if (Comparable.class.isAssignableFrom(pOriginal.getClass())) {
// Type safety: The method compareTo(Object) belongs to the raw type Comparable. References to generic type Comparable<T> should be parameterized
isPropertySame = Comparable.class.cast(pOriginal).compareTo(Comparable.class.cast(pUpdated)) == 0;
// The method compareTo(capture#19-of ?) in the type Comparable<capture#19-of ?> is not applicable for the arguments (capture#21-of ? extends Comparable)
Comparable<?> comparable = Comparable.class.cast(pOriginal);
isPropertySame = comparable.compareTo(comparable.getClass().getTypeParameters()[0].getGenericDeclaration().cast(pUpdated)) == 0;
// Even if I get the generics right, I still get an error if pOriginal is java.sql.Timestamp and pUpdated is java.util.Date (happens all the time with Hibernate).
isPropertySame = (help);
} else {
isPropertySame = pOriginal.equals(pUpdated);
}
if (!isPropertySame) {
PropertyDelta delta = new PropertyDelta(pd, pOriginal, pUpdated);
dao.save(delta);
}
}
關於我可以投入(幫助)的任何想法?
'Timestamp'和'Date'的問題是一個衆所周知的問題:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4631234。它已經在Java 6中修復(可能也在5u6)。 – notnoop 2009-08-06 22:00:54
變量「originalValue」和「updatedValue」分別應該是「pOriginal」和「pUpdated」嗎? – erickson 2009-08-06 22:02:08
我很高興Timestamp/Date混淆被修復。恐怕它不能幫助我,因爲我被困在1.5,但很高興知道未來。 – 2009-08-06 22:32:39