Можно ли определить класс с помощью а также использовать этот класс как параметр метода как класс - PullRequest
2 голосов
/ 07 мая 2020

Я видел код в android, который определяет следующий класс:

android.widget.AdapterView<T extends android.widget.Adapter>

, а также имеет следующий интерфейс: AdapterView.OnItemClickListener , который содержит следующий метод, который должен быть реализован :

onItemClick(AdapterView<?> parent, View view, int position, long id)

Я не могу понять, как работает первый параметр, если AdapterView был определен с ограничением (extneds ...) Как это может быть знак остановки, если он должен быть Адатпер или что-то на его основе?

1 Ответ

0 голосов
/ 07 мая 2020

Класс AdapterView<T extends android.widget.Adapter> требует, чтобы конкретный тип, используемый для создания его экземпляра, расширял адаптер, и поэтому методы адаптера могут использоваться внутри.

Объявление интерфейса (которое на самом деле не должно быть внутри этого класса) принимает параметр AdapterView<?>, где ? - это так называемый подстановочный знак. Это означает, что тип неизвестен и может быть любым.

Для класса это имеет значение, потому что его реализация фактически будет делать что-то с типом, который передается как параметр generi c. Вы можете определить верхнюю или нижнюю границу типа, но в этом случае нельзя использовать неизвестный тип.

В случае интерфейса - это не общий c. Кроме того, этот метод не является общим c, но принимает AdapterView любого типа. Из-за подстановочного знака любое AdapterView может быть передано в onItemLongClick. Это потому, что AdapterView<A> не является подклассом AdapterView<B>, даже если A является подклассом B. Это объясняется здесь (с примером):

https://docs.oracle.com/javase/tutorial/java/generics/subtyping.html

Вы можете узнать больше о Java дженериках здесь: Как дженерики дженерики работают?

или / и здесь:

https://docs.oracle.com/javase/tutorial/java/generics/index.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...