实例化通用抽象类的子(具体)类,其构造函数需要其他参数类

时间:2015-12-12 10:24:40

标签: java generics inheritance instantiation

我正在尝试使用的库有一个通用的抽象类,它有两个实现基类的子类。我想编写一个类,它将根据构造函数参数的参数类型自动创建其中一个子节点的实例。

  • 基类没有默认构造函数
  • 基类的构造函数需要其他通用类的实例

片段

unigram.wfreq

现在我想包装两个具体的子节点,以便包装器/工厂根据参数类型类自动决定调用/实例化哪一个,类似这样(我得到各种编译器错误)

public abstract class JsonRequest<T> {
    public JsonRequest(String body, Listener<T> listener) {}
}
public class JsonArrayRequest extends JsonRequest<JSONArray> {
    public JsonArrayRequest(JSONArray body, Listener<JSONArray>) {}
}
public class JsonObjectRequest extends JsonRequest<JSONObject> {
    public JsonObjectRequest(JSONObject body, Listener<JSONObject>) {}
}
  • 我该怎么做? (最好没有铸造)
  • 是否有更好的方法来包装public class RequestFactory<T> { private Listener<T> mListener; public RequestFactory(T body, Listener<T> lis) { mListener = lis; if (body instanceof JSONArray) { // Call JsonArrayRequest constructor JsonArrayRequest(body, mListener); } else if (body instanceof JSONObject) { // Call JsonObjectRequest constructor JsonObjectRequest(body, mListener); } } } JsonArrayRequest,以便根据传递的JsonObjectRequest参数的类型自动调用它们的构造函数?
  • 这可以用Java吗?

(我实际上是在尝试使用Android's Volley library

1 个答案:

答案 0 :(得分:1)

您正在寻找Abstract Factory Design Pattern

public interface RequestFactory<T> {
    public JsonRequest<T> create(T body, Listener<T> listener);
}

public class ArrayRequestFactory implements RequestFactory<JSONArray> {
    @Override
    public JsonArrayRequest create(JSONArray body, Listener<JSONArray> listener) {
        return new JsonArrayRequest(body, listener);
    }
}

public class ObjectRequestFactory implements RequestFactory<JSONObject> {
    @Override
    public JsonObjectRequest create(JSONObject body, Listener<JSONObject> listener) {
        return new JsonObjectRequest(body, listener);
    }
}

通过动态调度选择构造函数,而不是if条件。