在我们当前的代码库,我们有如下数据结构我们的服务层,我们的前端层之间进行通信:如何让一个类扩展另一个扩展类与泛型集合的工作?
public class BaseView {
private Integer id;
// Other common attributes and getters/setters;
}
public class BarView extends BaseView {
private String name;
private String Description;
// Other attributes for this object and getters/setters;
}
我们也有一些双扩展类:
public class BazView extends BaseView {
// name, description, other common attributes;
}
public class BazTypeAView extends BazView {
// attributes specific to Type A Baz;
}
public class BazTypeBView extends BazView {
// attributes specific to Type B Baz;
}
我们服务层,我们有实现BaseService的服务方法:BarService
,BazService
,BazTypeAService
,BazTypeBService
和其他具有相似命名方案的方法,它们都有方法返回它们负责的类或者List<class they are responsible for>
。反过来,这些方法中的每一个都会调用BaseService中的方法,其签名为GetObjects(Class Viewtype, Class BeanType, Criteria)
,其中基于参数的标准传递给特定的方法方法。 Beans位于服务层和数据访问层之间,与此无关。
的方案的例子:
public interface BaseService {
public BaseView getObject(Class viewType, class beanType, Integer id);
public List<BaseView> getObjects(Class viewType, class beanType, Criteria criteria);
}
public class BaseServiceImpl implements BaseService {
protected BaseView getObject(Class viewType, class beanType, Integer id){
BaseBean bean = (BaseBean) DataService.getobject (beanType, id);
BaseView view = ViewGenerator.createEmptyView(viewType);
copyAttributes(bean, view);
return view;
}
protected List<BaseView> getObject(Class viewType, class beanType, Criteria criteria){
List<BaseBean> bean = (List<BaseBean>) DataService.getobject (beanType, Criteria);
List<BaseView> view = new ArrayList<BaseView>();
copyAttributes(bean, view);
return view;
}
}
public interface BarService extends BaseService {
public BarView getBar(Integer id);
public List<BarView> getBars(BarView barView);
}
public class BarServiceImpl extends BaseServiceImpl implements BarService {
public BarView getBar(Integer id){
BarView bar = getObject(BarView.class, BarBean.class, id);
return bar;
}
public List<BarView> getBars(BarView barView){
Criteria criteria = getCriteriaFromBarView(barView);
List<BarView> bars = getObjects(BarView.class, BarBean.class, criteria);
return bars;
}
}
以上是系统大致是如何工作的。创建酒吧,获取酒吧列表,更新酒吧并删除酒吧的方法都与上述内容完全相同。
问题是getObject返回一个原始列表,导致很多Eclipse警告和代码难以阅读。这个项目的2/3以上的警告都是关于原始类型的使用情况,尽管我们的代码仍然按照它应该编译和运行,但它是很多消息。
如果我们没有扩展扩展类的第二种视图,我们可以做List<? extends Fooview>
,但是这会给扩展BazView的类带来错误。有两种方法可以让泛型类型在这里工作吗?扩展Baseview和?扩展X扩展Baseview?
@AxelH问题是我们有时在我们的服务中有方法返回不同的视图。例如,BarService可能有一个方法GetConnectedBazTypeAs(),它返回一个BazTypeA类型的列表。 – Nzall
关闭课程,但对于每个服务,您需要将通用类型设置为正确类型的视图。 – AxelH
这里我在解答中多加一点解释 – AxelH