статический <T расширяет число & сопоставимый <? супер номер >> - PullRequest
5 голосов
/ 01 ноября 2011

У меня следующий класс с одним статическим методом:

public class Helper {

    public static <T extends Number & Comparable<? super Number>> Boolean inRange(T value, T minRange, T maxRange) {
        //  equivalent (value >= minRange && value <= maxRange)
        if (value.compareTo(minRange) >= 0 && value.compareTo(maxRange) <= 0)
            return true;
        else
            return false;
    }

}

Я пытаюсь вызвать этот метод:

Integer value = 2;
Integer min = 3;
Integer max = 8;
Helper.inRange(value, min, max) ;

Компилятор Netbeans покажет мне это сообщение об ошибке:

метод inRange в классе Helper нельзя применять к данным типам;Обязательно: T, T, T найдено: java.lang.Integer, java.lang.Integer, java.lang.Integer причина: выведенный тип не соответствует объявленным границам. Вывод: java.lang.Integer bound (s): java.lang.Number, java.lang.Comparable

Есть идеи?

спасибо.

1 Ответ

10 голосов
/ 01 ноября 2011

Попробуйте <T extends Number & Comparable<T>>.

например. Integer реализует Comparable<Integer>, что несовместимо с Comparable<? super Number> (целое число не является суперклассом числа). Comparable<? extends Number> также не будет работать, потому что Java будет думать, что ? может быть любым подклассом Number, а передача T в compareTo не будет компилироваться, поскольку она ожидает параметр ?, а не T.

Редактировать: , как сказал newacct, <T extends Number & Comparable<? super T>> тоже будет работать (и будет немного более общим), поскольку тогда compareTo примет любое ?, из которых T является подклассом, и как обычно, экземпляр подкласса может быть задан в качестве параметра, где ожидается суперкласс.

...