S'amuser avec les génériques Java
-
08-07-2019 - |
Question
Quelqu'un sait comment écrire le code ci-dessous en utilisant des génériques ET en évitant les avertissements du compilateur? (@SuppressWarnings ("décoché") est considéré comme de la triche).
Et, peut-être, en vérifiant via des médicaments génériques que le type de "gauche" correspond au type de " right " ?
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);
}
}
La solution
Ceci fonctionne également avec les sous-classes de types 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);
}
}
Autres conseils
Que diriez-vous de cela:
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);
}
}
Cela pourrait probablement être
Vous ne pouvez pas, via les génériques, vérifier si le type de «gauche» est identique à celui de «droite» au moment de l'exécution. Les génériques Java sont implémentés via type effacement , de sorte que les informations sur les paramètres de type générique sont perdues à l'exécution.
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);
}
}