Тесты Пообщаться с GPT Протестировать код
Программирование Аналитика Дизайн Маркетинг Управление проектами
25 Июл 2023
2 мин
144

Почему в Java разрешено «extends T», но не «implements T»?

Пройдите тест, узнайте какой профессии подходите

Часто при создании параметризованных классов в Java возникает вопрос о разнице между ключевыми словами extends и implements. Возможно, кто-то попробовал написать

Часто при создании параметризованных классов в Java возникает вопрос о разнице между ключевыми словами extends и implements. Возможно, кто-то попробовал написать код вроде этого:

public interface C {}
public class A<B implements C> {} 

Однако, компилятор Java выдаст ошибку. В то же время, если заменить implements на extends, то все будет работать:

public class A<B extends C> {} 

Вопрос, который встает здесь: почему так происходит? Почему extends разрешено, а implements нет?

Ответ на этот вопрос связан с тем, как в Java работают обобщения. Когда мы говорим о параметрах типа, то extends используется для ограничения сверху, а не implements. Это означает, что B должен быть подтипом C, независимо от того, является ли C классом или интерфейсом.

Вот пример. Если у нас есть класс A<T extends C>, то T может быть либо классом, который наследуется от C, либо интерфейсом, который расширяет C, либо C самим по себе.

В Java, когда говорят «класс B расширяет класс A» или «интерфейс I расширяет интерфейс J«, они имеют в виду наследование. Именно поэтому extends используется вместо implements при определении границ для параметров типа.

Стоит отметить, что использование extends вместо implements в данном контексте не меняет основных принципов наследования и реализации интерфейсов. Это просто соглашение об именовании, которое существует в синтаксисе Java.

Добавить комментарий