Generics. Разница между wildcard и type parameter.

 
 
 
Сообщения:1
Разница не особо понятна. Пожалуйста, объясните. Я, видимо, ошибаюсь, думая, что можно всегда просто type parameters юзать. Когда юзать одно, когда другое?
Использование wildcard bound и type parameter bound также неясно.
 
 
Сообщения:2
Ап, данный вопрос тоже вызвал затруднения.
 
 
Сообщения:619
Может у вас неудачный источник?
Вопрос не сильно понятен если честно, т.к. вещи о которых вы говорите ни разу не похожи, чтобы их путать.
Определения согласно Википедии http://en.wikipedia.org/wiki/Generics_in_Java http://en.wikipedia.org/wiki/Wildcard_(Java) своими словами:
type parameters - параметр которым может параметризоваться вас Generic.
wildcard bound - ограничение которое вы накладываете на ваш type parameters в момент объявления переменной(либо локальной, либо field класса, либо параметр метода) вашего Generic класса.

Пример:
class ArrayList<T> {
...
}
в данном случае T - это параметр type parameter класса ArrayList.

Объявить переменную вы можете следующим образом:
ArrayList<Number> arrayList = new ArrayList<Number>();
Все четко, при объявлении параметр T задаете как Number.

Например вы хотите написать функцию которая суммирует все элементы коллекции.
public static double sum(ArrayList<Number> numbers){
    double summ = 0.0;
    for(Number curNumber : numbers)
        summ += curNumber.doubleValue();
    return summ;
}

Но проблема в том что вы не сможете передать в данный метод коллекцию с type parameter Integer(который вроде бы extends Number): ArrayList<Integer>.
В таком случае вводят wildcard bound на параметр метода:
public static double sum(ArrayList<? extends Number> numbers){
...
}

Т.е. метод принимает тип ArrayList который параметризирован Number или наследником Number. Вызов:

Почему такое ограничение - мне рассказывать долго. Предлагаю ознакомиться с работой Generics в книге Эккеля Философия Java.

P.S. Поправьте плиз, если где-то был не прав.
 
 
Сообщения:2
благодарю! вчера сам в ходе экспериментов дошел до этого,но не был уверен,достаточное ли это объяснение разницы. теперь все четко разложил по полочкам благодаря вашему ответу.
спасибо!
 
 
Сообщения:2
а чем использование wildcard в
public static double sum(ArrayList<? extends Number> numbers){
...
}

отличается от использования Generic bounded type parameters в коде ниже?

public static <T extends Number> double sum(ArrayList<T> numbers){
...
}
 
 
Сообщения:6977
Тем, что во втором случае Вы в методе знаете тип объекта (T), а в первом нет. И это Вас ограничивает в манипуляциях с коллекцией. Добавьте в каждый метод код:

if (numbers.size() > 1)
    numbers.add(numbers.remove(0));


Если у Вас wildcard - эту операцию компилятор не даст провести. А если тип - даст.

С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
 
 
Сообщения:2
спасибо, что дает указание типа понятно.
А какие плюсы у использования wildcard в первом случае? Нужен ли такой вариант вообще или в любых случаях лучше второй вариант?
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет