Условная ошибка точки останова - Тип не реализует селектор max и подпись - PullRequest
3 голосов
/ 31 марта 2011

Я пытаюсь отладить часть моего кода, где (Integer) значения на карте иногда становятся удивительно высокими.

Когда я делаю это

Collection<Integer> vals = newState.values();
int max = Collections.max(vals);
return newState; // breakpoint here

, я могуустановите условную точку останова в строке оператора return с условием, включающим max, например, max > 10.Когда я опускаю среднюю строку и устанавливаю условие точки останова на Collections.max(vals) > 10, я получаю исключение времени выполнения в режиме отладки.

"Причина: тип не реализует селектор max и подпись (Ljava / util / Collection;) Ljava / lang / Comparable;"

Я могу получить то, что хочу, с фрагментом кода выше, но мне все еще интересно, что здесь происходит.Предполагая, что это может быть метод Collections, который не может понять, что Integer действительно сопоставим, я попытался Collections.<Integer>max(v) и некоторые (неправильный синтаксис) варианты, но безуспешно.

Ответы [ 2 ]

5 голосов
/ 31 марта 2011

Collections.max() имеет интересный трюк в своей подписи:

public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)

Как видите, extends Object выглядит здесь избыточно.Хитрость заключается в том, что во время стирания типа T превращается в его первый общий предел (т. Е. Object), поэтому фактическая стертая сигнатура этого метода выглядит следующим образом:

public static Object max(Collection coll)

Это сделано для сохранения двоичногосовместимость с предварительной универсальной версией этого метода: код, скомпилированный с предварительной универсальной версией, ожидает, что тип возвращаемого значения будет Object, и при использовании этого трюка новая версия удовлетворяет его ожидания.

Однако, как вы можете видеть, отладчикнеправильно предполагает, что стирание T равно Comparable.Возможно, это ошибка в отладчике.

0 голосов
/ 06 июля 2012

В большинстве случаев это происходит, когда вы вызываете статический метод в той же области видимости с префиксом ссылки на класс

Пример

public final class SomeUtilClass{
    public static boolean utilMethod1() {
     //
    }

    public static boolean utilMethod2() {

        if(SomeUtilClass.utilMethod1()) {
           // 
        }
    }
}

в приведенном выше примере с помощью utilMethod2 мы использовали utilMethod1 с фиксированием имени класса (т.е. SomeUtilClass.utilMethod1 ()), что не нужно, поскольку оба находятся в одной и той же области видимости, это похоже на вызов локального частного метода

В этом случае префикс SomeUtilClass. "Не нужен, он вызовет такого рода проблемы при отладке, если мы удалим префикс« SomeUtilClass. »Из условия if, он будет работать нормально ..., так как utilMethod2 не нуждается в каком-либо классе ссылка на вызов utilMethod1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...