【问题标题】:Class<T extends AnotherClass> methods genericsClass<T extends AnotherClass> 方法泛型
【发布时间】:2015-06-14 01:46:05
【问题描述】:

我有这门课

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

    }

}

重点是,我希望活动显示带有实现中设置的参数的方法。

【问题讨论】:

  • 如果您创建了new ClusterMapPresenter&lt;OtherClusterItemImpl&gt;().getMockItems() 会怎样?返回的列表将显示为 List&lt;OtherClusterItemImpl&gt;,但将包含 SpeditionClusterItem 值。
  • 这不是泛型的使用方式。在ClusterMapPresenter 内部,您不知道T 的类型是什么,但您的代码对其进行了假设。如果您更清楚地解释为什么要尝试这样做,我们可能会提出替代方案。一开始可能没有理由使用泛型。
  • 重点是我目前在带有新ClusterMapPresenter&lt;SpeditionClusterItem&gt;(this) 的活动中使用它,我想将生成的方法显示为 List (这就是我想使用的原因泛型)
  • 我会发布更多代码sn-ps。
  • 如果您知道生成的List 应该始终是List&lt;SpeditionClusterItem&gt;,您为什么认为您需要泛型?发布更多代码可能会有所帮助,但同样,请更清楚地解释您要做什么以及为什么

标签: java generics inheritance casting abstraction


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-05-21
    • 1970-01-01
    • 2011-11-09
    • 2020-08-22
    • 2013-08-13
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多