有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

  • 基类没有默认构造函数
  • 基类的构造函数也需要其他泛型类的实例

片段

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);
        }
    }
}
  • 我该怎么做?(最好不铸造)
  • 是否有更好的方法包装JsonArrayRequestJsonObjectRequest,以便根据传递的body参数类型自动调用它们的构造函数
  • 这在Java中可能吗

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


共 (1) 个答案

  1. # 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条件