У меня есть следующий встроенный компаратор.
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
является необработанным типом.Ссылки на универсальный тип Comparable<T>
должны быть параметризованы
И если я вместо этого параметризирую типы в соответствии с предложением:
if (o1 instanceof Comparable) {
return ((Comparable<SampleClass>) o1).compareTo(o2);
Тогда я получаю предупреждения ...
Тип безопасности: непроверенное приведение от SampleClass
до Comparable<SampleClass>
И если я проверю тип:
if (o1 instanceof Comparable<SampleClass>) {
return ((Comparable<SampleClass>)o1).compareTo (o2);
Я получуследующий ошибка :
Невозможно выполнить проверку экземпляра типа Comparable<SampleClass>
.Вместо этого используйте форму Comparable<?>
, поскольку информация общего типа будет удалена во время выполнения
И снова, если я последую совету сообщения об ошибке:
if (o1 instanceof Comparable<?>) {
return ((Comparable<?>)o1).compareTo (o2);
Я получаю эту ошибку:
Метод compareTo(capture#4-of ?)
в типе Comparable<capture#4-of ?>
не применим для аргументов (SampleClass)
Теперь я неНе знаю, как действовать, я действительно предпочитаю код, который не содержит предупреждений и ошибок. Как создать код без предупреждения с требуемым поведением?