2016-11-11 8 views
1

私は、次の名前の衝突

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

} 

イムのようなインターフェースが

Error:(44, 10) error: name clash: bindView(VH#1,List) in IDrawerItem and bindView(VH#2,List) in IItem have the same erasure, yet neither overrides the other where VH#1,VH#2 are type-variables: VH#1 extends ViewHolder declared in interface IDrawerItem VH#2 extends ViewHolder declared in interface IItem

次のエラーを得ることがなぜ、そうですか?

+0

スーパーインタフェースの1つに 'bindView'メソッドが宣言されていますか?あなたはそれを上書きしようとしているのですか? – khelwood

+0

これを上書きしようとしています –

+1

実装をオーバーライドすることができます。 – khelwood

答えて

3

短い回答:署名を変更することはできません。インターフェイスを拡張すると、インターフェイスにさらにシグネチャが追加されます。

オーバーライドは、インターフェイスではなくクラスでのみ行うことができます。シグネチャを更新することはできませんが、同じシグネチャを使用してそのメソッドの実装を変更することはできます。

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

関連する問題