2014-10-08 4 views
0

Я понимаю, что <? extends T> в Java грубо эквивалентен экзистенциальному определителю (∃), но равен <? super T>, связанным с универсальным классификатором (∀)?Универсальный определитель в Java-дженериках?

Не стесняйтесь исправить меня, если я ошибаюсь в отношении ∃.

Это рано, и я в замешательстве, так что, может быть, это болтовня. Я мог бы купить, что оба они экзистенциальны, так как направление не должно отрицать логику «для некоторых» отношений ..?

Частично вызвано тем фактом, что List[_] в Scala описывается как existential, и это примерно то же, что и List<?> в Java.

+2

Я думаю, что здесь что-то не хватает, но как похоже на экзистенциальный определитель? – LionC

+2

Я не вижу связи между «существует» (∃), «для всех ...» (∀) и этими ключевыми словами. Этот [ответ] (http://stackoverflow.com/a/4343547/1919228) объясняет совершенно ясно, что они означают: один позволяет спуститься в иерархии классов, а другой позволяет подняться до –

+1

, что является безумным разговором, цианид! – user2504380

ответ

3

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

Универсальные типы - это только параметры типа. Например, здесь:

class List<T> { ... } 

T произвольно, как это имеет неявный универсальный классификатор.

0

Основное различие между <? super T> и <? extends T> является то, что первой декларация говорит, что какой-то тип является предком T и второй говорят, что какой-то тип является подклассом T. Я не вижу никакой корреляции с экзистенциальным классификатором или универсальным квалификатор здесь. Как заметил кто-то в комментариях, более вероятное сходство (если у вас действительно должно быть одно) - это тип пола и потолка. Тем не менее, это действительно абстрактная аналогия.

1

На самом деле это не связано с предикатной логикой, связанной с типом иерархии. Я могу понять, почему вы можете прочитать вслух <? extends T> как «Для всех T», но его расширять до «Для всех объектов, которые имеют суперкласс T», а не «Для всех T в X», как в предикатной логике.

Аналогично <? super X> следует читать как «Для объектов, которые относятся к типу, который представляет собой супер класс на X»

Смежные вопросы