Класс 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