Часто при создании параметризованных классов в 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.
Добавить комментарий