Какой конструктор это, начиная с <T extends Drawable & DrawerToggle>?
<T extends Drawable & DrawerToggle> ActionBarDrawerToggle(
Activity activity,
Toolbar toolbar,
DrawerLayout drawerLayout,
T slider,
@StringRes int openDrawerContentDescRes,
@StringRes int closeDrawerContentDescRes) {
Во время просмотра исходного кода класса ActionBarDrawerToggle.java я обнаружил, что этот конструктор объявлен без спецификации доступа. Скорее, его объявление начинается с
<T extends Drawable & DrawerToggle>
Пожалуйста, объясните, что это значит?
Ответы
Ответ 1
T
- это объявление общего типа, которое затем используется как тип для одного из аргументов - slider
.
<T extends Drawable & DrawerToggle >
означает, что T
должен расширять/внедрять классы Drawable
и DrawerToggle
классов/интерфейсов.
Спецификатор доступа не является обязательным. В случае его отсутствия это означает, что класс/метод доступен только из классов внутри одного пакета.
Ответ 2
Как и обычные методы, конструкторы могут принимать параметры типа. Это упоминается в этом разделе Спецификации языка Java:
https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.8
Из упомянутого там синтаксиса вы можете иметь параметры типа в сигнатуре:
TypeParameters:
< TypeParameterList
>
TypeParameterList:
TypeParameter {, TypeParameter}
и где TypeParameter указан как
TypeParameter:
{TypeParameterModifier} Identifier [TypeBound]
TypeParameterModifier:
Annotation
TypeBound:
extends
TypeVariable
extends
ClassOrInterfaceType {AdditionalBound}
AdditionalBound:
&
InterfaceType
Ответ 3
Этот блок указывает тип параметров slider
(значение параметра ползунка должно расширять классы drawable и drawabletoggle (или интерфейсы)). Поиск дженериков для получения дополнительной информации.