Почему дженерики в коллекциях java такие странные? - PullRequest
4 голосов
/ 17 декабря 2010

Например, метод проверки в java.util.Collections

 public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) 

Почему я могу определить его следующим образом:

 public static <T> int binarySearch(List<T> list, T key, Comparator<T> c) 

Почему это не будет работать в Java?

Ответы [ 2 ]

14 голосов
/ 17 декабря 2010

Вы могли бы определить это таким образом, но тогда это не позволило бы вам искать List<Circle> с использованием, например, Comparator<Shape>.

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

0 голосов
/ 17 декабря 2010

Для усиления ответа Джона Скита дженерики Java не похожи на шаблоны C ++. Некоторые из проектных решений (например, стирание типов) для обобщений, сделанные для обратной совместимости самой JVM, приводят к неловкому синтаксису и сложным вариантам использования. О некоторых из них вы можете прочитать здесь.

...