2009-09-17 2 views
1

Кто-нибудь знает, как написать часть кода ниже с помощью дженериков И избегать предупреждений компилятора? (@SuppressWarnings («unchecked») считается изменой).Удовольствие от генераторов Java

И, может быть, проверка через дженерики, что тип «левый» совпадает с типом «права»?

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); 
    } 
} 

ответ

12

Это работает с подклассов Сопоставимые типы:

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); 
    } 
} 
+1

Это своего рода дополнительное осложнение I думал, да :) –

2

Вы не можете через generics проверить, является ли тип 'left' таким же, как тип 'right' во время выполнения. Генераторы Java реализуются через type 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); 
    } 
} 
3

Как об этом:

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); 
    } 
} 

Это, вероятно, может быть сделан немного немного больше общего, но только делает его более сложным, а :)