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

2022-09-02 20:27:16
<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 >具体来说意味着必须扩展/实现类/接口。TDrawableDrawerToggle

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


答案 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