java ジェネリクス - <T extends Drawable&DrawerToggle>で始まるこのコンストラクタはどのようなものですか?




複数 メソッド (4)

通常のメソッドと同様に、コンストラクタは型パラメータを取ることができます。 これは、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:

TypeVariable

extends ClassOrInterfaceType {AdditionalBound}

AdditionalBound:

& InterfaceType

この質問には既に回答があります:

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

説明してください、それは本当に何を意味しますか?


このブロックは、 sliderパラメータの型を指定します( sliderパラメータの値はdrawableおよびdrawabletoggleクラス(またはインタフェース)を拡張する必要があります)。 詳細はジェネリックスを検索してください。


Tはジェネリック型宣言で、引き数の1つであるslider型として使用されます。

<T extends Drawable & DrawerToggle >は、 TDrawerToggleクラスとDrawerToggleクラス/インタフェースの両方を拡張/実装しなければならないことを意味します。

アクセス指定子は必須ではありません。 欠けている場合は、クラス/メソッドが同じパッケージ内のクラスからのみアクセス可能であることを意味します。


はい、コンストラクタで仮想メソッドを呼び出すことは一般的には悪いことです。

この時点で、オブジェクトはまだ完全に構築されていない可能性があり、メソッドによって予期される不変量はまだ保持されていない可能性があります。





java android constructor