Отказ от ответственности: я не профессиональный разработчик, и я не собираюсь им стать. Читая книгу о Java, так как я хотел попробовать программирование на Android, никакого предыдущего опыта работы с Java вообще не было.
Я читаю эту книгу - и мне она очень нравится. Я прочитал часть главы об общих классах, дошел до того, что они упоминают подстановочные знаки, и запутался.
Если B расширяет A:
List<B>
не является подтипом List<A>
(насколько я понимаю, они точно такие же)
List<? extends B>
является подтипом List<? extends A>
Последний позволяет писать функции, которые принимают аргументы общего типа, например List<? extends A>
. Такая функция будет принимать аргумент либо List<B>
, либо List<A>
.
Теперь, на мой вопрос:
Не проще ли реализовать дженерики способом, аналогичным C ++ (в виде шаблона)? Это сделает List<B>
и List<A>
двумя отдельными типами, которые будут связаны ожидаемым образом. Это также позволило бы просто указать в функции, что вы ожидаете, что аргумент будет иметь тип List<A>
, что позволит List<B>
вписываться туда просто отлично.
Я предполагаю, что было более чем "мы ненавидим C ++, давайте изменим ситуацию" за этим :) Также вполне возможно, что я еще ничего не знаю, что делает подстановочные знаки фантастическими и полезный инструмент. Что вы думаете об этом?
Редактировать: , если вы упоминаете List<X>
в своем ответе, не забывайте использовать обратные метки, чтобы <X>
не интерпретировался как HTML-тег.