Generics: В чем разница между?, Object и необработанным типом одного экземпляра?
Я знаю разницу между Collection<?>
, Collection<Object>
а также Collection
,
Первый принимает только любой тип, второй должен разрешать все объекты, а третий не проверяется.
Но для одного экземпляра (не коллекции), например ScheduledFuture<?>
, ScheduledFuture<Object>
а также ScheduledFuture
, в чем разница? Кажется, что все они позволяют все.
2 ответа
Спецификация языка Java пишет:
Использование необработанных типов допускается только в качестве уступки совместимости устаревшего кода. Использование необработанных типов в коде, написанном после введения обобщений в язык программирования Java, настоятельно не рекомендуется. Вполне возможно, что будущие версии языка программирования Java будут запрещать использование необработанных типов.
Это оставляет два других. Как ScheduledFuture
использует только параметр типа в типе возвращаемого метода, ScheduledFuture<?>
(что так же, как ScheduledFuture<? extends Object>
) эквивалентно ScheduledFuture<Object>
на вызывающий код.
Однако код, который фактически создает экземпляр ScheduledFuture, должен работать с подклассом ScheduledFuture и может сильно заботиться о параметре типа, с которым подкласс реализует ScheduledFuture.
При объявлении метода, который возвращает ScheduledFuture, вы, следовательно, захотите использовать тип ScheduledFuture<?>
поскольку эта подпись проще для производителя ScheduledFuture, но в равной степени полезна для ее потребителя. (Это просто особый случай правила PECS.)
Они не являются взаимозаменяемыми. Коллекция без спецификатора типа является несвязанной, и поэтому ее методы API возвращают Object по умолчанию. Смотрите этот вопрос для хорошего объяснения разницы между Collection<?>
а также Collection<Object>
В чем разница? и объект в дженериках Java?,