Java 如何使扩展另一个扩展类的类与泛型集合一起工作?
在我们当前的代码库中,我们有以下数据结构在服务层和前端层之间进行通信:Java 如何使扩展另一个扩展类的类与泛型集合一起工作?,java,generics,inheritance,Java,Generics,Inheritance,在我们当前的代码库中,我们有以下数据结构在服务层和前端层之间进行通信: public class BaseView { private Integer id; // Other common attributes and getters/setters; } public class BarView extends BaseView { private String name; private String Description; // Other a
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
、一个BazTypeAsService
、一个BazTypeBService
和其他具有类似命名方案的方法,这些方法都返回它们负责的类或一个列表。反过来,这些方法中的每一个都使用签名GetObjects(Class Viewtype,Class BeanType,Criteria)
从BaseService调用一个方法,条件基于传递到特定方法中的参数。bean位于服务层和数据访问层之间,与此无关
该计划的一个例子是:
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;
}
}
公共接口基本服务{
公共BaseView getObject(类viewType、类beanType、整数id);
公共列表getObjects(类viewType、类beanType、条件);
}
公共类BaseServiceImpl实现BaseService{
受保护的BaseView getObject(类viewType、类beanType、整数id){
BaseBean=(BaseBean)DataService.getobject(beanType,id);
BaseView视图=ViewGenerator.createEmptyView(视图类型);
copyAttributes(bean、视图);
返回视图;
}
受保护列表getObject(类viewType、类beanType、条件){
List bean=(List)DataService.getobject(beanType,Criteria);
列表视图=新建ArrayList();
copyAttributes(bean、视图);
返回视图;
}
}
公共接口BarService扩展了BaseService{
公共工具栏视图getBar(整数id);
公共列表getBars(BarView BarView);
}
公共类BarServiceImpl扩展BaseServiceImpl实现BarService{
公共工具栏视图getBar(整数id){
BarView bar=getObject(BarView.class,BarBean.class,id);
返回杆;
}
公共列表getBars(BarView BarView){
Criteria=getCriteriaFromBarView(barView);
列表栏=getObjects(BarView.class、BarBean.class、criteria);
返回杆;
}
}
以上是该系统的大致工作原理。创建条形图、获取条形图列表、更新条形图和删除条形图的方法实际上与上述方法相同
问题是getObject返回一个原始列表,导致大量Eclipse警告和更难阅读的代码。我们对这个项目的警告中有超过2/3是关于原始类型使用的,尽管我们的代码仍能正常编译和工作,但还是有很多消息
如果我们没有扩展扩展类的第二种视图,我们可以只做List如果我理解正确,您需要的是使您的BaseService
获得将在getObject
方法中使用的泛型类型:
基本服务类别:
public class <T extends FooView> BaseService<T> {
public T getObject() {
...
}
}
公共类基本服务{
公共T getObject(){
...
}
}
在具体服务中:
public class BazTypeAService extends BaseService<BazTypeAView> {
...
}
公共类BazTypeAsService扩展了BaseService{
...
}
如果我理解正确,您需要的是使您的基本服务
获得将在getObject
方法中使用的泛型类型:
基本服务类别:
public class <T extends FooView> BaseService<T> {
public T getObject() {
...
}
}
公共类基本服务{
公共T getObject(){
...
}
}
在具体服务中:
public class BazTypeAService extends BaseService<BazTypeAView> {
...
}
公共类BazTypeAsService扩展了BaseService{
...
}
使用代码样式的快速答案,如果我不太理解,我将删除它
尝试使用以下泛型类型:
public abstract class BarService<T extends FooView>{
List<T> list;
...
public List<T> getList(){ return list;}
}
public class BazService extends BarService<BazView>{
...
}
public class BazTypeBService extends BarService<BazTypeBView>{
...
}
...
公共抽象类服务{
名单;
...
public List getList(){return List;}
}
公共类服务扩展了BarService{
...
}
公共类BazTypeBService扩展了BarService{
...
}
...
这里,
BazService.getList() will return a List<BazView> instance
BazTypeBService .getList() will return a List<BazTypeBView> instance
BazService.getList()将返回一个列表实例
BazTypeBService.getList()将返回一个列表实例
使用代码样式的快速答案,如果我不太理解,我将删除它
尝试使用以下泛型类型:
public abstract class BarService<T extends FooView>{
List<T> list;
...
public List<T> getList(){ return list;}
}
public class BazService extends BarService<BazView>{
...
}
public class BazTypeBService extends BarService<BazTypeBView>{
...
}
...
公共抽象类服务{
名单;
...
public List getList(){return List;}
}
公共类服务扩展了BarService{
...
}
公共类BazTypeBService扩展了BarService{
...
}
...
这里,
BazService.getList() will return a List<BazView> instance
BazTypeBService .getList() will return a List<BazTypeBView> instance
BazService.getList()将返回一个列表实例
BazTypeBService.getList()将返回一个列表实例
我的答案与其他答案没有太大区别,只是我想您的BaseService是一个接口:
在我们的服务层中,我们有实现基本服务的服务方法
我会这样定义接口(EDIT):
公共接口基本服务{
T getObject(类viewType,类我的答案与其他答案没有太大区别,只是我想您的BaseService是一个接口:
在我们的服务层中,我们有实现基本服务的服务方法
我会这样定义接口(EDIT):
公共接口基本服务{
T getObject(类viewType,Class@AxelH问题是,我们的服务中有时会有返回不同视图的方法它返回类型BazTypeA.Off的列表,但是对于每个服务,您需要将泛型类型设置为正确的视图类型answer@AxelH问题是,我们的服务中有时会有返回不同视图的方法它返回类型BazTypeA.Off的列表,但是对于每个服务,您需要将泛型类型设置为正确的视图类型
public class DataService {
public static <T extends FooBean> T getObject(Class<T> beanType, Integer id){return null;}
public static <T extends FooBean> List<T> getAllObjects(Class<T> beanType){return null;}
}
public class ViewGenerator {
public static <T> T createEmptyView(Class<T> viewType){return null;}
}