Верхний ограниченный шаблон в Java - PullRequest
0 голосов
/ 30 июня 2018

У меня есть два общих метода, которые вычисляют сумму элементов списка. Подписи методов:

  1. double method1(List<? extends Number> list) - здесь я использую подстановочный знак.

  2. <U extends Number> double sumOfList1(List<U> list) - Здесь есть имя для параметра типа.

Есть ли разница между этими двумя или они одинаковы с точки зрения функциональности? Использование имени параметра типа вместо подстановочного знака имеет какие-либо преимущества?

public static double sumOfList(List<? extends Number> list) {
    double s = 0.0;
    for (Number n : list)
        s += n.doubleValue();
    return s;
}

 public static <U extends Number> double sumOfList1(List<U> list) {
    double s = 0.0;
    for (Number n : list)
        s += n.doubleValue();
    return s;
}

Спасибо.

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Поскольку вы не использовали U в этом методе, они не имеют разницы.

0 голосов
/ 30 июня 2018

Нет абсолютно никакой разницы, цель объявления U состоит в том, чтобы вы могли использовать его:

public static <U extends Number> void doSomething(List<U> list, Consumer<U> sink) {
    list.forEach(sink::accept)
}

Это означает, что вас не волнует , что такое U, но оно должно простираться от Number. Что вас беспокоит, так это то, что List содержит тип, совместимый с тем, что может принимать Consumer.


В качестве альтернативы вы можете использовать U внутри метода для объявления новых экземпляров универсального типа:

public static <U extends Number> List<U> copy(List<U> list) {
    List<U> copy = new ArrayList<>();
    copy.addAll(list)
    return copy;
}

да, я знаю, есть более аккуратные способы сделать это - пожалуйста, отнеситесь к этому как иллюстративный пример

0 голосов
/ 30 июня 2018

Из-за стирания типа код, выполняемый в конце, одинаков, поэтому нет никакой разницы в использовании одного над другим.

Тип стирания объяснен на этом сайте как:

Процесс применения ограничений типа только во время компиляции и отбрасывание информации о типе элемента во время выполнения.

...