Divertimento con generici Java
-
08-07-2019 - |
Domanda
Qualcuno sa come scrivere il pezzo di codice sotto usando i generici ED evitando gli avvisi del compilatore? (@SuppressWarnings (" deselezionato ") è considerato imbroglione).
E, forse, controllando tramite generici che il tipo di "lasciato" è è lo stesso del tipo di "destra" ?
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);
}
}
Soluzione
Funziona anche con sottoclassi di tipi comparabili:
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);
}
}
Altri suggerimenti
Che ne dici di questo:
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);
}
}
Probabilmente potrebbe essere reso un poco un po 'più generale, ma solo rendendolo anche più complicato :)
Non è possibile, tramite generics, verificare se il tipo di 'left' è uguale al tipo di 'right' in fase di esecuzione. I generici Java vengono implementati tramite type erasure , in modo che le informazioni sui parametri di tipo generico vengono perse in fase di esecuzione.
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);
}
}