Развлечения с Java-дженериками
Кто-нибудь знает, как написать часть кода ниже с помощью дженериков И избегать предупреждений компилятора? (@SuppressWarnings ( "unchecked" ) считается изменой).
И, может быть, проверка через generics, что тип "left" совпадает с типом "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);
}
}
Ответы
Ответ 1
Это также работает с подклассами типов Comparable:
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);
}
}
Ответ 2
Как насчет этого:
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);
}
}
Возможно, это было бы немного более общим, но только с усложнением:)
Ответ 3
Вы не можете через generics проверить, является ли тип "left" таким же, как тип "right" во время выполнения. Генераторы Java реализуются с помощью типа erasure, так что информация о параметрах родового типа теряется во время выполнения.
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);
}
}