这是什么样的构造函数,从<T extends Drawable&DrawerToggle>开始?

Vik*_*dar 18 java android constructor

<T extends Drawable & DrawerToggle> ActionBarDrawerToggle(
        Activity activity, 
        Toolbar toolbar,
        DrawerLayout drawerLayout, 
        T slider,
        @StringRes int openDrawerContentDescRes,
        @StringRes int closeDrawerContentDescRes) {
Run Code Online (Sandbox Code Playgroud)

在浏览ActionBarDrawerToggle.java类的源代码期间,我发现这个构造函数是在没有访问说明符的情况下声明的.相反,它的声明始于

<T extends Drawable & DrawerToggle>
Run Code Online (Sandbox Code Playgroud)

请解释一下,它究竟意味着什么?

Zby*_*000 23

T是泛型类型声明,然后用作其中一个参数的类型 - slider.

<T extends Drawable & DrawerToggle >特别是指T必须扩展/实现两者DrawableDrawerToggle类/接口.

访问说明符不是必需的.如果缺少它,则意味着只能从同一个包中的类访问类/方法.

  • @Stultuske:我不明白这一点.方法和构造函数中的泛型定义没有区别. (5认同)
  • 对于一种方法,是的.对于构造函数,没有. (3认同)
  • @SrinathGanesh:在构造函数中,他们可能只定义构造函数参数类型.这很明显,因为构造函数没有任何返回类型. (3认同)

man*_*uti 8

与普通方法一样,构造函数可以采用类型参数.这在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