Почему SomeClass <? супер T> не эквивалентный SomeClass <T> в Java универсальные типы?

Пожалуйста, удалите

android:focusableInTouchMode="true"
android:focusable="true"

и дайте мне знать статус.

8
задан MPelletier 30 April 2012 в 04:10
поделиться

5 ответов

У Josh Bloch был разговор на Google I/O в этом году, названный Эффективным Перезагруженным Java, который можно найти интересным. Это говорит о мнемосхеме под названием "Печ" (производитель extends, потребитель super), который объясняет, почему Вы используете ? extends T и ? super T в Ваших входных параметрах (только; никогда для типов возврата), и когда использовать который.

7
ответ дан 5 December 2019 в 12:14
поделиться

Существует действительно хорошее (но извилистое) объяснение этого в Большем количестве Забавы с Подстановочными знаками.

6
ответ дан 5 December 2019 в 12:14
поделиться

Это подобно C#, я просто узнал об этом пару несколько дней назад относительно почему (твердый путь и затем информативный путь PDC).

Принять Dog extends Animal

Blah<Dog> не то же как Blah<Animal> у них есть совершенно другие подписи типа даже при том, что Dog расширяется Animal.

Например, примите метод на Blah<T>:

T Clone();  

В Blah<Dog> это Dog Clone(); в то время как в Blah<Animal> это Animal Clone();.

Вам нужен способ отличить это, в компиляторе может быть сказано это Blah<Dog> имеет тот же открытый интерфейс Blah<Animal> и это что <? super T> указывает - любой класс, используемый в качестве T, может быть уменьшен до своего суперкласса с точки зрения Blah<? super T>.

(В C# 4.0 это было бы Blah<out T> Я верю.)

1
ответ дан 5 December 2019 в 12:14
поделиться

Это очевидно для Вас это, в случае Comparator, любой предок T работал бы. Но компилятор не знает тот класс Comparator функции как этот - просто нужно сказать, должно ли это позволить <T> или <? super T>.

Просматриваемый иначе, да это верно что любой Comparator из предка работал бы в этом случае - и способ, которым разработчик библиотеки говорит, что это должно использовать <? super T>.

0
ответ дан 5 December 2019 в 12:14
поделиться

Простой ответ на Ваш вопрос - то, что разработчик библиотеки хотел дать максимальную гибкость пользователю библиотеки; эта сигнатура метода, например, позволяет Вам делать что-то вроде этого:

List<Integer> ints = Arrays.asList(1,2,3);
Comparator<Number> numberComparator = ...;

Collections.sort(ints, numberComparator);

Используя подстановочный знак препятствует тому, чтобы Вы были вынуждены использовать a Comparator<Integer>; то, что язык требует, чтобы подстановочный знак был указан разработчиком библиотеки, позволяет ему или разрешить или ограничить такое использование.

0
ответ дан 5 December 2019 в 12:14
поделиться
Другие вопросы по тегам:

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