2015-06-14 2 views
0

Хотя на поиски на понимание о Java генериков, я пришел через это:Generic Wildcard Bounded Тип против Generic Тип параметра ограниченной

public static <T extends Number> int sumListElems(List<T> list){ 
    int total = 0; 
    for(Number n: list) 
     total += n.intValue(); 
    return total; 
} 

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

Но какая разница этого кода к этому:

public static int sumListElems(List<? extends Number> list){ 
    int total = 0; 
    for(Number n: list) 
     total += n.intValue(); 
    return total; 
} 

Оба компилирует и выполняет, как ожидалось. Каковы различия между этими двумя? Помимо синтаксиса? Когда я предпочел бы использовать подстановочный знак над первым?

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

+2

В этом случае они эквивалентны. –

+1

http://stackoverflow.com/questions/30763895/why-use-a-wild-card-capture-helper-method/30765179#30765179 – ZhongYu

+2

http://stackoverflow.com/questions/15125616/java-generics-wildcards/15125788 # 15125788 – ZhongYu

ответ

2

Никакой разницы в этом случае. Для более сложных подписей вам может потребоваться повторное использование определенного типа, поэтому определение необходимо. Что-то вроде:

public static <T extends Number> void foo(T bar, List<T> myList)... 

Это не только гарантирует, что оба bar и элементы myList продлить номер, но они того же типа. Вы не могли бы положительно применить это с другим синтаксисом.

Смежные вопросы