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