Sto davvero cercando di amare i farmaci generici, ma finora i problemi che hanno causato superano qualsiasi beneficio. Per favore, per favore, mostrami che ho torto.Provare a confrontare, quindi confrontare
Capisco la necessità di aggiungere @SuppressWarnings ("deselezionato") quando si usano framework generici (Spring, Hibernate). Questo da solo riduce davvero il valore dei generici, così come le classi obbligatorie vengono passate nel costruttore per evitare le insidie della cancellazione. Tuttavia, sembra che la vera spina sia lanciare. Di solito provo un po 'per ottenere la sintassi giusta, ma poi rinunciare al mio tentativo di purezza, aggiungere un @SuppressWarnings e andare avanti con la mia vita.
Ecco un esempio: sto riflettendo su un bean per cercare le differenze tra due istanze. Alcune proprietà implementano Comparable tale che (a.equals (b) == false) ma (a.compareTo (b) == 0) (ad es. BigDecimal, Date). In questi casi, voglio che la proprietà sia considerata la stessa.
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);
}
}
Tutte le idee su quello che ho potuto mettere in (aiuto)?
Il problema con 'Timestamp' e' Date' è un problema ben noto: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4631234. È stato corretto in Java 6 (probabilmente anche in 5u6). – notnoop
Le variabili "originalValue" e "updatedValue" dovrebbero essere "pOriginal" e "pUpdated", rispettivamente? – erickson
Sono contento che sia stata corretta la confusione del timestamp/della data. Ho paura che non mi aiuti dato che sono bloccato al 1.5, ma è bello sapere per il futuro. –