2016-09-26 116 views
2

我想在android中实现基本的抽象类。Java泛型 - 抽象类抽象函数覆盖

我的基本抽象类是BaseItemPresenter类。类别如下:

public abstract class BaseItemPresenter<T extends MvpView> extends BasePresenter<T> { 

    public abstract void loadFromDevice(); 

    public abstract void loadFromFile(); 

    public abstract void backup(List<? extends BaseBackupItem> list); 

    public abstract void delete(List<? extends BaseBackupItem> list); 

    public abstract void restore(List<? extends BaseBackupItem> list); 

    public abstract void sort(int sortType, boolean isAscending); 

    public abstract void sort(List<? extends BaseBackupItem> list, int sortType, boolean isAscending); 

    public abstract void filter(List<? extends BaseBackupItem> list, Class<? extends MvpView> filterOptions); 
} 

我正在用ItemPresenter1类实现这个类。代码如下:

public class ItemPresenter1 extends BaseItemPresenter<MvpView> { 

    @Override 
    public void loadFromDevice() { 

    } 

    @Override 
    public void loadFromFile() { 

    } 

    @Override 
    public void backup(List<Item1> list) { 

    } 

    @Override 
    public void delete(List<Item1> list) { 

    } 

    @Override 
    public void restore(List<Item1> list) { 

    } 

    @Override 
    public void sort(int sortType, boolean isAscending) { 

    } 

    @Override 
    public void sort(List<Item1> list, int sortType, boolean isAscending) { 

    } 

    @Override 
    public void filter(List<Item1> list, Class<View1> filterOptions) { 

    } 
} 

Item1类扩展了BaseBackupItem类。 View1类正在扩展MvpView类。

public class Item1 extends BaseBackupItem { 

} 

public class View1 extends MvpView { 

} 

所以,我应该怎么实现这个问题:

来自:

public abstract void backup(List<? extends BaseBackupItem>); 

到:

@Override 
public void backup(List<Item1>); 

错误:

Method does not override method from its superclass. 
+2

将另一个通用参数添加到类中,并使用IT作为列表的类型 –

+0

为什么需要更改签名?它的工作原理是 – Blackbelt

回答

1

你需要一个新类型参数为了增加的BaseItemPresenter类定义指定List作为未来预期的类型:

public abstract class BaseItemPresenter<T extends MvpView, I extends BaseBackupItem> 
    extends BasePresenter<T> { 
    ... 
    public abstract void backup(List<I> list); 

    public abstract void delete(List<I> list); 

    public abstract void restore(List<I> list); 

    ... 
} 

然后你ItemPresenter1类将被宣布为下一:

public class ItemPresenter1 extends BaseItemPresenter<MvpView, Item1 > { 
    ... 
    @Override 
    public void backup(List<Item1> list) { 
+0

。谢谢你的回答。 – okarakose