Удовольствие от дженериков Java
-
08-07-2019 - |
Вопрос
Кто-нибудь знает, как написать фрагмент кода ниже с использованием обобщений и избегая предупреждений компилятора? (@SuppressWarnings (" unchecked ") считается обманом).
И, может быть, проверяя с помощью шаблонов, что тип " оставлен " такой же, как тип "право"
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);
}
}
Решение
Это также работает с подклассами сопоставимых типов:
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);
}
}
Другие советы
Как насчет этого?
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);
}
}
Вероятно, это можно сделать немного немного более общим, но только сделав его более сложным:)
Вы не можете с помощью общих проверок проверить, совпадает ли тип 'left' с типом 'right' во время выполнения. Обобщения Java реализованы с помощью стирания типа , так что информация о параметрах универсального типа теряется во время выполнения.
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);
}
}
Не связан с StackOverflow