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