Дженерики Java - почему, “расширяют T”, позволенный, но не “реализует T”?

Я думаю, что выбор между Java и C # - это не вопрос языковых возможностей, а вопрос выбора платформы и экосистемы.

Итак, я сомневаюсь, что любой новый синтаксический сахар в Java или C # может привести к значительному количеству переключателей между платформами.

В конце концов, в мире JVM есть Scala, и многие разработчики, чувствительные к языку, используют его каким-то образом.

293
задан Andrew Tobilko 25 May 2019 в 02:24
поделиться

3 ответа

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

class MyGen<T, U extends T> {

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

7
ответ дан 23 November 2019 в 01:38
поделиться

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

323
ответ дан 23 November 2019 в 01:38
поделиться

Вероятно, потому что для обеих сторон (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 , но с дополнительными возможностями. Здесь важны возможности, а не реализация.

17
ответ дан 23 November 2019 в 01:38
поделиться
Другие вопросы по тегам:

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