Diversión con genéricos de Java
-
08-07-2019 - |
Pregunta
¿Alguien sabe cómo escribir el siguiente código utilizando genéricos Y evitando las advertencias del compilador? (@SuppressWarnings (" desmarcado ") se considera trampa).
Y, tal vez, comprobando a través de genéricos que el tipo de '' dejó '' es el mismo que el tipo de "derecho" ?
public void assertLessOrEqual(Comparable left, Comparable right) {
if (left == null || right == null || (left.compareTo(right) > 0)) {
String msg = "["+left+"] is not less than ["+right+"]";
throw new RuntimeException("assertLessOrEqual: " + msg);
}
}
Solución
Esto también funciona con subclases de tipos comparables:
public <T extends Comparable<? super T>> void assertLessOrEqual(T left, T right) {
if (left == null || right == null || left.compareTo(right) > 0) {
String msg = "["+left+"] is not less than ["+right+"]";
throw new RuntimeException("assertLessOrEqual: " + msg);
}
}
Otros consejos
¿Qué tal esto?
public <T extends Comparable<T>> void assertLessOrEqual(T left, T right) {
if (left == null || right == null || (left.compareTo(right) > 0)) {
String msg = "["+left+"] is not less than ["+right+"]";
throw new RuntimeException("assertLessOrEqual: " + msg);
}
}
Probablemente podría hacerse un poco un poco más general, pero solo haciéndolo más complicado también :)
No puede verificar mediante genéricos si el tipo de 'izquierda' es el mismo que el tipo de 'derecha' en tiempo de ejecución. Los genéricos de Java se implementan a través de tipo de borrado , para que la información sobre los parámetros de tipo genérico se pierde en tiempo de ejecución.
public <T extends Comparable<T>> void assertLessOrEqual(T left, T right) {
if (left == null || right == null || (left.compareTo(right) > 0)) {
String msg = "["+left+"] is not less than ["+right+"]";
throw new RuntimeException("assertLessOrEqual: " + msg);
}
}