Realmente intento gustarme de los genéricos, pero hasta ahora el problema que han causado supera cualquier beneficio. Por favor, muéstrame que estoy equivocado.Casting a Comparable, luego comparando
Entiendo la necesidad de agregar @SuppressWarnings ("desmarcado") al utilizar marcos genéricos libres (Spring, Hibernate). Esto solo realmente reduce el valor de los genéricos, al igual que las clases que requieren pasar al constructor para evitar las trampas de borrado. Sin embargo, la verdadera espina siempre parece estar lanzando. Por lo general, intento por un tiempo obtener la sintaxis correcta, pero luego renuncio a mi intento de pureza, agrego un @SuppressWarnings y sigo con mi vida.
Aquí hay un ejemplo: estoy reflexionando sobre un frijol para buscar diferencias entre dos instancias. Algunas propiedades implementan Comparable de modo que (a.equals (b) == false) pero (a.compareTo (b) == 0) (por ejemplo, BigDecimal, Date). En estos casos, quiero que la propiedad se considere igual.
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);
}
}
¿Alguna idea sobre qué podría poner (ayudar)?
El problema con 'Timestamp' y' Date' es un problema bien conocido: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4631234. Se ha corregido en Java 6 (probablemente en 5u6 también). – notnoop
¿Se supone que las variables "originalValue" y "updatedValue" son "pOriginal" y "pUpdated", respectivamente? – erickson
Me alegro de que se haya solucionado la confusión Timestamp/Date. Me temo que no me ayuda, ya que estoy estancado en 1.5, pero es bueno saberlo para el futuro. –