AFAIK, мой класс extends
родительских классов и implements
интерфейсов. Но я сталкиваюсь с ситуацией, когда я не могу использовать implements SomeInterface
. Это объявление универсальных типов. Например:
public interface CallsForGrow {...}
public class GrowingArrayList <T implements CallsForGrow> // BAD, won't work!
extends ArrayList<T>
Здесь использование implements
синтаксически запрещено. Сначала я подумал, что использование интерфейса внутри <> вообще запрещено, но нет. Это возможно, я должен использовать только extends
вместо implements
. В результате я «расширяю» интерфейс. Этот другой пример работает:
public interface CallsForGrow {...}
public class GrowingArrayList <T extends CallsForGrow> // this works!
extends ArrayList<T>
Для меня это выглядит как синтаксическое несоответствие. Но, может быть, я не понимаю некоторые особенности Java 6? Есть ли другие места, где я должен расширять интерфейсы? Должен ли интерфейс, который я имею в виду расширить, иметь какие-то особые функции?
источник
extends
иimplements
, просто если смотреть на проблему с точки зрения системы типов, то нет никакой разницы.T
это класс?T
может ссылаться на тип интерфейса илиenum
тип.:
. и под прикрытием интерфейс является и всегда был абстрактным классом с ограничением, состоящим только из невыполненныхabstract
членов virtual ( ), чтобы обеспечить множественное наследование. нет буквально никакой разницы междуimplements
иextends
. оба они могут быть заменены одним и тем же словом (extends
) или произвольным символом (:
), и ничего не будет потеряно.Когда Java 5 и, в частности, дженерики, изначально были доступны для разработчиков, которые зарегистрировали интерес, синтаксис был совершенно другим. А не так
Set<? extends Foo>
иSet<? super Bar>
былоSet<+Foo>
иSet<-Foo>
. Тем не менее, обратная связь заключалась в том, что неясно,+
означает ли это более конкретный или более широкий (больше классов) . Sun отреагировала на эту обратную связь, изменив синтаксис, но в рамках ограничения не вводить новые ключевые слова, что было бы проблемой для обратной совместимости.В результате ни то, ни другое не вполне естественно. Как вы заметили,
extends
он перегружен разговорами о классах, «расширяющих» интерфейсы, что не является языком, используемым в других контекстах; иsuper
перегружен, чтобы означать «является суперклассом», что является противоположным направлением отношения, ранее выраженного ключевым словом, то есть ссылаясь на суперкласс.Тем не менее, это изменение не влияет на основные принципы интерфейса, и оно не содержит специальных интерфейсов, которые расширены по-новому.
источник
Есть недостатки как в том, чтобы разрешать, так и в запрещении такого синтаксиса, а те, которые разрешают , намного выше.
Просто подумай об этом.
Разделение интерфейса и реализации является одной из основных идиом программирования. Из-за этого синтаксис, позволяющий записать «интерфейс реализует что-то» , будет примерно таким же плохим, как и использование знака «плюс» для обозначения умножения операндов.
источник
Нужно понимать программирование на основе интерфейса как следующий шаг при понимании интерфейса. Это говорит о том, что является фактическим использованием интерфейса. Какую роль он играет в программе Java (или любого другого языка).
источник