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