Проверка типов и обобщений в Java генерирует предупреждения - PullRequest
2 голосов
/ 20 декабря 2011

У меня есть следующий встроенный компаратор.

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)


Теперь я неНе знаю, как действовать, я действительно предпочитаю код, который не содержит предупреждений и ошибок. Как создать код без предупреждения с требуемым поведением?

Ответы [ 2 ]

4 голосов
/ 20 декабря 2011

Проблема в том, что компилятор не может знать, что то, что вы делаете, безопасно.Вместо этого вы должны верить, что знаете, что делаете, и можете добавить эту аннотацию

@SuppressWarnings("unchecked")

к методу или классу, и предупреждение исчезнет.

0 голосов
/ 20 декабря 2011

Попробуйте

 if (o1 instanceof Comparable<?>) {
        return ((Comparable<SampleClass>)o1).compareTo (o2);
...