Ограничить параметр типа с помощью обобщений - PullRequest
0 голосов
/ 21 мая 2019

Учитывая интерфейс Calorie и реализованные классы

// Interface that defines that item has calories and may be compared by it

interface Calorie extends Comparable<Calorie> {
  public int compareTo(Calorie object);
  public int getCalories();
}

// Examples of classes CaloryGrader is supposed to work with
class Drink implements Calorie {
    // Some implemenation...
}

class Bakery implements Calorie {
    // Some implementation...
}

class Cake extends Bakery {
    // Some implementation...
}


## Given CaloryGrader class where I need to implement sorted static "grade" method ##

class CaloryGrader {

    /**
     * Returns sorted in ascending order copy of items list.
     * 
     * Sort order is defined by item calories.
     *
     * @param items collection of items to sort
     * @return sorted copy
     */

    public List grade(List items) {
        // Add implementation
    }

}

Задача состоит в том, чтобы - написать оценку с помощью обобщений, чтобы она могла сортировать только список элементов, которые включают в себя Calories и его подклассы.

Я написал следующую подпись метода оценки

  public static <T extends Calorie> List<T> grade(List<T> items) {

Тем не менее, он не работает, и я не могу понять, почему.

T тип элемента, который может принять метод List является типом возврата метода

Я предполагал, что аргумент List ограничит список, который может быть передан методутолько для всех подклассов калорий.Но сейчас это не правильно.

Я могу создать список raw type и передать его методу.Я предполагаю, что это связано с тем, что он преобразуется в List и подходит.

Разрешение должно состоять в том, чтобы не передавать необработанные типы в метод и получать ошибку во время компиляции.Наверное, я что-то упустил.

1 Ответ

0 голосов
/ 21 мая 2019

Вы можете использовать массив для этого жесткого ограничения: класс (T [] items)

Кроме того, список с массивом для быстрого преобразования туда и обратно.

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