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?,

Другие вопросы по тегам