Class <t extends =“”anotherclass =“”> methods generics </t>

时间:2015-04-08 21:41:18

标签: java generics inheritance casting abstraction

我有这个班级

public class ClusterMapPresenter<T extends ClusterItem>{

    private ClusterMapView<T> clusterMapView;

    public ClusterMapPresenter(ClusterMapView<T> clusterMapView){
        this.clusterMapView = clusterMapView;
    }

    public void createView() {
        setItems(getMockItems());
    }

    private List<T> getMockItems() {
        List<T> items = new ArrayList<>();
        items.add( new SpeditionClusterItem(new Spedition(Constants.MOCK)));
        return items;
    }   

    public void setItems(List<T> clusterItems){
        clusterMapView.setMarkers(clusterItems);
    }
}

SpeditionClusterItem实施ClusterItem

我只是通过将转换添加到T来实现它的工作

items.add((T)new SpeditionClusterItem(new Spedition(Constants.MOCK)));

但是,我不喜欢这种方法,有没有更好的方法来设计这个课程?

我将添加下一段代码:

public interface ClusterMapView<T extends ClusterItem> extends BaseView {
    public void setMarkers(List<T> markers);

}

此界面在以下活动中实施:

public class Activity implements ClusterMapView<SpeditionClusterItem> {

    private ClusterMapPresenter<SpeditionClusterItem> mClusterMapPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
...
        mClusterMapPresenter = new ClusterMapPresenter<>(this);
...        
    }


    @Override
    public void setMarkers(List<SpeditionClusterItem> markers) {
        mMapFragment.addItemsToMap(markers);

    }

}

关键是,我希望活动在实现中显示带参数集的方法。

1 个答案:

答案 0 :(得分:0)

好吧,我通过将列表检索与演示者分开,在构造函数中添加列表来解决它。

public ClusterMapPresenter(ClusterMapView<T> clusterMapView, List<T> clusterItems){
        this.clusterMapView = clusterMapView;
        this.clusterItems = clusterItems;
    }

我不确定这是好设计,但它确实有效。欢迎任何关于如何改进它的建议。