【问题标题】:"References to generic type JsonResponse should be parameterized"“应该参数化对泛型类型 JsonResponse 的引用”
【发布时间】:2014-04-16 07:38:28
【问题描述】:

我有一个用于处理 Ajax 请求的 Servlet,它以 JSON 格式提供响应。

我在网上收到此警告,如下所述。类型安全:方法 setResponseData(Object) 属于原始类型 JsonResponse。对泛型 JsonResponse 的引用应该被参数化

我应该以其他方式执行此操作,还是添加 SuppressWarning 注释是否安全

public class JsonResponse<T>
{
    private T responseData;
    private boolean success;
    private String errorMessage;
    // + Getters and Setters
}

public class AjaxJson extends HttpServlet
{
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    {
        String function = request.getParameter("func");
        if (function == null)
            function = "";

        JsonResponse<?> jsonResponse;

        if (function.equals("getUsers"))
            getUsers(jsonResponse);
    }

    private void getUsers(JsonResponse jsonResponse)
    {
        jsonResponse = new JsonResponse<List<User>>();

        // Lets say I have a class called User
        List<User> users = new ArrayList<Users>();
        // get users and add to list

        jsonResponse.setResponseData(users); // Warning on this line
        jsonResponse.setSuccess(true);
    }
}

【问题讨论】:

    标签: java generics servlets


    【解决方案1】:

    您将JsonResponse 用作泛型

    private void getUsers(JsonResponse jsonResponse)
    

    改成

    private void getUsers(JsonResponse<List<User>> jsonResponse)
    

    Java 总是对使用泛型发出警告,有关更多信息,请查看 SO 上的 this 问题。

    【讨论】:

    • 是的,至少警告现在消失了。但是现在我在 getUsers(jsonResponse) 上遇到编译错误:AjaxJson 类型中的方法 getUsers(JsonResponse) 不适用于参数 (JsonResponse)
    【解决方案2】:

    不要将原始类型与参数化类型混合使用。根本不要使用原始类型。

    修改getUsers() 方法,因为您总是创建一个新的JsonResponse,即您不需要传递任何对象。

    private JsonResponse<List<User>> getUsers(){
        JsonResponse<List<User>> jsonResponse = new JsonResponse<List<User>>();
    
        // Lets say I have a class called User
        List<User> users = new ArrayList<Users>();
        // get users and add to list
    
        jsonResponse.setResponseData(users); // No warning on this line
        jsonResponse.setSuccess(true);
        return jsonResponse;
    }
    

    请确认。很可能您已将其定义为

    public void setResponseData(Object value){...}
    

    用下面的替换它

    public void setResponseData(T value){...}
    

    【讨论】:

    • 我已将其实现为 setResponseData(T value)
    • 问题出在JsonResponse&lt;?&gt; jsonResponse;。我已经更新了我的帖子。
    • JsonResponse> jsonResponse的原因是类型T取决于传递给Servlet的函数参数。
    • 传递的类型是什么?
    • 看看我更新后的方法getUsers()
    猜你喜欢
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2016-12-22
    • 1970-01-01
    相关资源
    最近更新 更多