Задний план
Этот вопрос предназначен как для разработчиков Java, так и для Android.
В Android я хочу иметь функцию, которая возвращает что-то, что расширяется из View и реализует проверяемый< /a>, оба являются частью Android API.
Что я пробовал
После небольшого поиска здесь и в других местах в Интернете я нашел это решение:
private <T extends View & Checkable> T get() {
return (T) mView;
}
Обратите внимание, что mView относится к любому типу, который расширяет View (а их много), но я гарантирую, что он реализует Checkable, так как там могут быть только эти типы.
Это показывает предупреждение «Безопасность типов: непроверенное приведение от View к T», но это не проблема. Проблема в том, что я не могу правильно использовать этот метод, например:
View v=get(); //this works fine
Checkable c=get(); // this shows error
вторая строка показывает ошибку:
Несоответствие границ: общий метод get() типа ... неприменим для аргументов (). Выведенный тип Checkable&View не является допустимой заменой ограниченного параметра.
Поэтому я попытался использовать "," вместо "&" . такая же ошибка.
Однако, когда я использую «,» и меняю порядок, я получаю предупреждение «Параметр типа View скрывает тип View», и обе строки работают нормально.
Это код:
private <T extends Checkable, View> T get() {
return null;
}
private void foo() {
final View v = get(); // this works fine
final Checkable c = get();// this works fine too
}
Однако, когда я отправляю возвращаемый тип другим функциям, они не получают сам тип как нечто, расширяющее класс и интерфейс, и все время требуют приведения (к представлению).
Вопрос
Как правильно это сделать?
Если последний способ, который я показал, правильный, почему я получаю предупреждение об этом? и почему порядок важен, если всегда есть максимум один класс для расширения?
mView
типом, который вы создали? - person Kevin Bowersox   schedule 30.10.2013