は、私たちは私たちのサービス層と、当社のフロントエンド層との間の通信に次のようなデータ構造を持っている:ジェネリックコレクションで別の拡張クラスを拡張するクラスを作成するにはどうすればよいですか?私たちの現在のコードベースで
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;
}
をBarService
、BazService
、BazTypeAService
、BazTypeBService
などの名前付けスキームを持ち、同様の名前付けスキームを持ち、すべて自分が担当するクラスを返すメソッドを持っています。List<class they are responsible for>
。次に、これらのメソッドはそれぞれ、特定のメソッドメソッドに渡されるパラメータに基づく基準を使用して、シグニチャ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;
}
}
システムの動作おおよそ方法です。バーを作成し、バーのリストを取得し、バーを更新し、バーを削除するメソッドは、実質的に上記と同じです。
問題は、getObjectがRaw Listを返すため、多くのEclipseの警告とコードが読みにくくなることです。このプロジェクトの警告の2/3以上は生の型の使用に関するものですが、コードはまだコンパイルされていますが、それはたくさんのメッセージです。
拡張クラスを拡張する2番目の種類のViewがない場合は、List<? extends Fooview>
を実行できますが、これはBazViewを拡張するクラスにエラーをもたらします。あなたは両方を持っているときジェネリック型をここで動作させる方法はありますか? Baseviewと?拡張XはBaseviewを拡張しますか?
BaseServiceクラス:
public class <T extends FooView> BaseService<T> {
public T getObject() {
...
}
}
と、特定のサービスで
@AxelH問題は、私たちがサービス内で時々別のビューを返すということです。たとえば、BarServiceには、BazTypeA型のリストを返すGetConnectedBazTypeAs()メソッドがあります。 – Nzall
もちろん、サービスごとに、ジェネリックタイプを正しいタイプのビューに設定する必要があります。 – AxelH
ここで私はもう少し答えを説明します – AxelH