Пожалуйста, удалите
android:focusableInTouchMode="true"
android:focusable="true"
и дайте мне знать статус.
У Josh Bloch был разговор на Google I/O в этом году, названный Эффективным Перезагруженным Java, который можно найти интересным. Это говорит о мнемосхеме под названием "Печ" (производитель extends
, потребитель super
), который объясняет, почему Вы используете ? extends T
и ? super T
в Ваших входных параметрах (только; никогда для типов возврата), и когда использовать который.
Существует действительно хорошее (но извилистое) объяснение этого в Большем количестве Забавы с Подстановочными знаками.
Это подобно 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>
Я верю.)
Это очевидно для Вас это, в случае Comparator
, любой предок T
работал бы. Но компилятор не знает тот класс Comparator
функции как этот - просто нужно сказать, должно ли это позволить <T>
или <? super T>
.
Просматриваемый иначе, да это верно что любой Comparator
из предка работал бы в этом случае - и способ, которым разработчик библиотеки говорит, что это должно использовать <? super T>
.
Простой ответ на Ваш вопрос - то, что разработчик библиотеки хотел дать максимальную гибкость пользователю библиотеки; эта сигнатура метода, например, позволяет Вам делать что-то вроде этого:
List<Integer> ints = Arrays.asList(1,2,3);
Comparator<Number> numberComparator = ...;
Collections.sort(ints, numberComparator);
Используя подстановочный знак препятствует тому, чтобы Вы были вынуждены использовать a Comparator<Integer>
; то, что язык требует, чтобы подстановочный знак был указан разработчиком библиотеки, позволяет ему или разрешить или ограничить такое использование.