2013-08-09 4 views
8

С Эффективное Java Глава 5 (генерики):Тип против неограниченного шаблона

// Two possible declarations for the swap method 
public static <E> void swap(List<E> list, int i, int j); 
public static void swap(List<?> list, int i, int j); 

Какой из этих двух деклараций является предпочтительным, и почему? В публичном API второй лучше, потому что он проще. Вы переходите в список - любой список - и метод свопирует индексированные элементы. Невозможно беспокоиться о параметре типа. Как правило, если параметр типа появляется только один раз в объявлении метода, замените его на шаблон.

Я не понимаю, почему второй вариант проще для клиента моего API? Я могу передать те же параметры первому и второму методам. Кроме того, второй требует вспомогательного метода для подстановочного подбора. Может ли кто-нибудь объяснить, почему второй рекомендуется? Спасибо!

+0

Возможные ответы: http://stackoverflow.com/questions/6231973/difference-between-list-list-listt-liste-and-listobject?rq=1 –

ответ

10

Часто задаваемые вопросы по Java-генераторам - отличный источник ответов на эти вопросы, а «подстановочный знак - общий» обсуждается подробно в Which one is better: a generic method with type parameters or a non-generic method with wildcards? и последующих примерах.

Angelika Langer приходит к выводу:

Вывод: Во всех этих примерах в основном это дело вкуса и стиля, предпочитаете ли вы общий или версию подстановочные. Обычно существует компромисс между простотой реализации (обычная версия часто проще реализовать) и сложностью подписи (у подстановочной версии меньше параметров типа или вообще нет).

Simpler метод подпись -> легче понять (даже если оба используются таким же образом) -> хорошо в общественном API (Компромисс: более сложная реализация)

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

+2

Пожалуйста, улучшите свой ответ, а не просто отметьте его как ссылку ответ. По крайней мере, скопируйте соответствующее содержимое ссылки в свой ответ в форме цитаты (используйте символ '>' в начале абзаца). –