что значит "какой-то неизвестный тип"
Что именно это означает: у Set
есть какой-то общий параметр, но мы не знаем, что это такое.
Таким образом, набор, присвоенный переменной Set<?>
, может быть Set<String>
, или Set<Integer>
, или Set<Map<Integer, Employee>>
, или набором, содержащим любой другой конкретный тип.
Итак, что это значит для того, как вы можете его использовать? Что ж, все, что вы получите из этого, будет экземпляром ?
, что бы это ни было. Поскольку мы не знаем, что такое параметр типа, вы не можете сказать ничего более конкретного, чем то, что элементы набора будут присваиваться Object
(только потому, что все классы наследуются от него).
И если вы думаете о добавлении чего-то в набор — ну, метод add
принимает ?
(что имеет смысл, так как это тип объектов в наборе). Но если вы попытаетесь добавить какой-либо конкретный объект, как вы можете быть уверены, что это безопасно для типов? Вы не можете - если вы вставляете строку, вы можете поместить ее, например, в Set<Integer>
, что нарушит безопасность типов, которую вы получаете от дженериков. Таким образом, пока вы не знаете тип универсального параметра, вы не можете предоставить какие-либо аргументы этого типа (за единственным исключением null
, так как это «экземпляр» любого типа).
Как и в случае с большинством ответов, связанных с дженериками, это было сосредоточено на коллекциях, потому что их легче понять инстинктивно. Однако аргументы применяются к любому классу, который принимает общие параметры. Если он объявлен с неограниченным подстановочным параметром ?
, вы не можете предоставлять ему какие-либо аргументы и любые значения, которые вы получаете этого типа можно будет назначить только Object
.
person
Andrzej Doyle
schedule
09.09.2011