У меня есть следующий встроенный компаратор.Typechecking и generics в java генерируют предупреждения
private static class SampleSorter implements Comparator<SampleClass>{
public int compare(SampleClass o1, SampleClass o2) {
if (o1 instanceof Comparable) {
return ((Comparable) o1).compareTo(o2);
} else if (o2 instanceof Comparable) {
return -((Comparable) o2).compareTo(o1);
}
return 0;
}
}
который генерирует следующие предупреждения:
Comparable
is a raw type. References to generic typeComparable<T>
should be parameterized
И если я вместо параметризации типов, как предложено:
if (o1 instanceof Comparable) {
return ((Comparable<SampleClass>) o1).compareTo(o2);
Тогда я получаю предупреждение ...
Type safety: Unchecked cast from
SampleClass
toComparable<SampleClass>
И если я проверки типов:
if (o1 instanceof Comparable<SampleClass>) {
return ((Comparable<SampleClass>)o1).compareTo (o2);
Я получаю следующее ошибки:
Cannot perform instanceof check against type
Comparable<SampleClass>
. Use the formComparable<?>
instead since generic type information will be erased at runtime
И опять же, если я следую совету сообщение об ошибке:
if (o1 instanceof Comparable<?>) {
return ((Comparable<?>)o1).compareTo (o2);
Я получаю эту ошибку:
The method
compareTo(capture#4-of ?)
in the typeComparable<capture#4-of ?>
is not applicable for the arguments(SampleClass)
Теперь я не знаю, как procede, я действительно Prefere код, который Предупреждение- и безошибочной. Как создать код без предупреждения с желаемым поведением?
На стороне записки: что произойдет, если o1 сравнима и o2 не? Кажется, что оба не могли сравниться. – oers