0

私は次のようなインターフェースを持っています

public interface IDrawerItem<T, VH extends RecyclerView.ViewHolder> extends IItem<T, VH>, IExpandable<T, IDrawerItem>, ISubItem<IDrawerItem, IDrawerItem> {
    void bindView(VH holder, List payloads);

}

次のエラーが表示されます

エラー:(44, 10) エラー: 名前の衝突: IDrawerItem の bindView(VH#1,List) と IItem の bindView(VH#2,List) には同じ消去がありますが、どちらも VH#1,VH# で他のものをオーバーライドしません2 は型変数です。VH#1 はインターフェイス IDrawerItem で宣言された ViewHolder を拡張します VH#2 はインターフェイス IItem で宣言された ViewHolder を拡張します

どうしてこんなことに?

4

1 に答える 1

2

簡単な答え: 署名は変更できないためです。インターフェイスを拡張すると、インターフェイスにシグネチャが追加されるだけです。

オーバーライドは、インターフェイスではなく、クラスでのみ実行できます。署名を更新することはできませんが、同じ署名を使用してそのメソッドの別の実装を作成できます。

インターフェースは、それを実装するクラスで利用可能でなければならない署名を表示するだけです。このため、サブクラスの実装を変更 (オーバーライド) できます。メソッドのシグネチャ (名前とパラメーター) は同じままであるため、インターフェイスに準拠しています。インターフェイスでオーバーライドする実装はありません。したがって、このインターフェイスを実装する任意のクラスにそのようなメソッドがあり、インスタンス化されたオブジェクトから呼び出すことができることのみを示しています。

于 2016-11-11T12:57:45.230 に答える