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);
    }
}
È stato utile?

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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top