在我們當前的代碼庫,我們有如下數據結構我們的服務層,我們的前端層之間進行通信:如何讓一個類擴展另一個擴展類與泛型集合的工作?
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