расширяет Comparable или реализует Comparable [duplicate]

class MyProgram
{
  int count = 0; // non-static variable / instance variable
  public static void main (String[] args) // static method
  {
    MyProgram c = new MyProgram(); // create c as reference variable
    System.out.println(c.count); // call non-static variable using a reference variable name (c)
  }
}

Компиляторы думают: «Я не знаю, какой объект является переменной экземпляра, о которой вы говорите».

Java Online

body, html, iframe { 
  width: 100% ;
  height: 100% ;
  overflow: hidden ;
}
<iframe src="https://ideone.com/SIDcv1" ></iframe>

259
задан Michael Myers 10 June 2009 в 16:54
поделиться

7 ответов

Поскольку интерфейсы - это просто классы, за исключением того, что они не имеют атрибутов или реализаций. Единственное использование ключевого слова «реализует» - позволить классу наследовать несколько интерфейсов, но не несколько классов, и мы можем видеть это в коде. Я не знаю, укажут ли они это в будущем, но это не обязательно.

-2
ответ дан Alfredo Barbosa 26 August 2018 в 15:35
поделиться

Вероятно, потому что для обеих сторон (B и C) применим только тип, а не реализация. В вашем примере

public class A<B extends C>{}

B также может быть интерфейсом. «extends» используется для определения суб-интерфейсов, а также подклассов.

interface IntfSub extends IntfSuper {}
class ClzSub extends ClzSuper {}

Я обычно думаю о том, что «Sub extends Super» используется как « Sub , как Super , но с дополнительными возможностями 'и' Clz реализует Intf 'как' Clz является реализацией Intf '. В вашем примере это будет соответствовать: B похоже на C , но с дополнительными возможностями. Здесь важны возможности, а не реализация.

14
ответ дан beetstra 26 August 2018 в 15:35
поделиться
  • 1
    Рассмотрим & lt; B удлиняет D & amp; Е & GT ;. E & lt; caps & gt; не должно & lt; / caps & gt; быть классом. – Tom Hawtin - tackline 19 June 2009 в 21:29

Это своего рода произвол, который из условий использования. Это могло быть в любом случае. Возможно, разработчики языка думали о том, что «расширяются» как самый фундаментальный термин, и «реализуют» как особый случай для интерфейсов.

Но я думаю, что implements будет иметь несколько больше смысла. Я думаю, что это больше связано с тем, что типы параметров не должны находиться в отношении наследования, они могут находиться в любом типе отношения подтипа.

В Java Glossary выражается аналогичный вид .

4
ответ дан Lii 26 August 2018 в 15:35
поделиться

Ответ здесь находится в : :

Чтобы объявить параметр ограниченного типа, укажите имя параметра типа, за которым следует ключевое слово extends, а затем его верхняя граница [...]. Обратите внимание, что в этом контексте расширения в общем смысле означают либо extends (как в классах), либо implements (как в интерфейсах).

Итак, у вас есть это немного запутанно, и Oracle это знает.

42
ответ дан MikaelF 26 August 2018 в 15:35
поделиться

Вот более привлекательный пример того, где разрешены расширения и, возможно, что вы хотите:

public class A<T1 extends Comparable<T1>>

7
ответ дан ntg 26 August 2018 в 15:35
поделиться

Семантическая разница в общем языке ограничений не существует между тем, реализуется ли класс «реализует» или «расширяет». Возможности ограничения - это «extends» и «super» - то есть, этот класс работает с назначаемым другому (extends), или этот класс можно назначить из этого (super).

303
ответ дан Tetsujin no Oni 26 August 2018 в 15:35
поделиться
  • 1
    @KomodoDave (я думаю, что номер рядом с ответом отмечает это как право, я не уверен, есть ли другой способ его пометить, иногда другие ответы могут содержать дополнительную информацию - например, у меня была конкретная проблема, которую я не мог решить, google отправляет вас сюда при поиске.) @Tetsujin no Oni (Можно ли использовать некоторый код для уточнения? thanx :)) – ntg 12 May 2014 в 01:38
  • 2
    @ntg, это очень хороший пример в вопросе поиска примеров - я свяжу его в комментарии, а не встраиваясь в ответ на этот момент. stackoverflow.com/a/6828257/93922 – Tetsujin no Oni 20 October 2014 в 14:44
  • 3
    Я думаю, что причина в том, что, по крайней мере, я хотел бы иметь общий тип, который может иметь конструктор и методы, которые могут принимать любой класс, который и расширяет базовый класс, и демонстрирует интерфейс, а не только интерфейсы, расширяющие интерфейс. Затем создайте экземпляр Genric-теста для присутствия интерфейсов и укажите фактический класс, заданный как параметр типа. В идеале я хотел бы class Generic<RenderableT extends Renderable implements Draggable, Droppable, ...> { Generic(RenderableT toDrag) { x = (Draggable)toDrag; } }. Один хочет проверить время компиляции. – peterk 5 May 2016 в 03:04
  • 4
    @peterk И вы получите это с помощью RenderableT extends Renderable, Draggable, Droppable .... если я не понимаю, что вы хотите, чтобы генерические файлы стираний делали для вас, что это не дает. – Tetsujin no Oni 5 May 2016 в 17:54
  • 5
    @TetsujinnoOni вы не в том, что я хочу, это для компиляции времени принудительного принятия только принятия классов, которые реализуют определенный набор интерфейсов, а затем иметь возможность ссылаться на класс OBJECT (который демонстрирует эти интерфейсы) в обобщенном виде, а затем знать, что по крайней мере во время компиляции (и желательно во время выполнения) все, что связано с общим, можно безопасно отнести к любому из указанных интерфейсов. Это не так, как теперь реализуется Java. Но было бы неплохо :) – peterk 7 May 2016 в 03:13

Возможно, базовый тип является общим параметром, поэтому фактический тип может быть интерфейсом класса. Рассмотрим:

class MyGen<T, U extends T> {

Также из интерфейсов клиентского кода перспективы практически неотличимы от классов, тогда как для подтипа важно.

7
ответ дан Tom Hawtin - tackline 26 August 2018 в 15:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: