【问题标题】:How to parametrize these methods?如何参数化这些方法?
【发布时间】:2018-02-27 10:17:42
【问题描述】:

我有下一段代码:

private boolean isResponseHasData(Response<ArrayList<PrefixPhoneModel>> response){
       return (response != null
               && response.body() != null
               && response.body().size() > 0
               && !response.body().isEmpty());
    }

    private boolean isResponseHasErrorBody(Response<ArrayList<PrefixPhoneModel>> response){
        return response != null && response.errorBody() != null;
    }

    private boolean isNoMoreDataToReturn(Response<ArrayList<PrefixPhoneModel>> response){
        return response != null && response.code() != 500;
    }

    private boolean isPreviousCallsWereSuccessful(){
        return getPrefixPhoneModels() != null && !getPrefixPhoneModels().isEmpty();
    }

我需要将这些方法与其他参数一起使用。现在,我有一个 ArrayList,但我需要使用更多类型的 ArrayLists、ArrayList、ArrayList...等。响应是相同的,但参数会发生变化。

如何更改此方法以接受任何 ArrayList。

谢谢。

【问题讨论】:

    标签: android class arraylist parameters


    【解决方案1】:

    这样的事情应该可以完成:

    public <E, L extends Collection<E>>  boolean isResponseHasData(Response<L> response);
    

    public <L extends Collection<?>>  boolean isResponseHasData(Response<L> response);
    

    或者只是

    public boolean isResponseHasData(Response<? extends Collection<?>> response);
    

    如果您需要在类型上设置边界,第一个很酷:&lt;E extends MyObject, ... &gt;

    【讨论】:

    • 好吧,也许我没有得到more types of ArrayLists, ArrayList, ArrayList... etc 的部分。我猜你需要不同的Collection 类型
    【解决方案2】:

    使用通用通配符?:

    private boolean isResponseHasErrorBody(Response<ArrayList<?>> response){
        ...
    }
    

    或者,如果您想要特定的类继承,请使用? extends [Some type here without brackets]

    如果您想要 List 类的任何子类,只需将 Response&lt;ArrayList&lt;?&gt;&gt; 替换为 Response&lt;List&lt;?&gt;&gt;,或者使用 Response&lt;Collection&lt;?&gt;&gt;


    或者,由于嵌套列表的类型无关紧要,您可以使用Response&lt;List&gt;Response&lt;Collection&gt;。在嵌套列表中使用通用通配符似乎不起作用

    【讨论】:

    • 是的,但是如果我使用“isResponseHasErrorBody(response)”和“response is type of ArrayList”,IDE 会将其标记为错误。
    • 使用这个“Response extends Collection>> response”错误消失
    • 错误说 Response> 与 ArrayList 不同。它让我改变类型。
    • 它仍然必须被包装在一个响应中,所以如果你传递一个带有 PrefixPhoneModel 和 Response> 输入类型的 ArrayList,它最终会出错
    【解决方案3】:

    也许您需要将这些方法移至另一个类

    class ResponseValidator<T> {
        private boolean isResponseHasData(Response<ArrayList<T>> response){
           return (response != null
                   && response.body() != null
                   && response.body().size() > 0
                   && !response.body().isEmpty());
        }
    
        private boolean isResponseHasErrorBody(Response<ArrayList<T>> response){
            return response != null && response.errorBody() != null;
        }
    
        private boolean isNoMoreDataToReturn(Response<ArrayList<T>> response){
            return response != null && response.code() != 500;
        }
    
        private boolean isPreviousCallsWereSuccessful(){
            return getPrefixPhoneModels() != null && !getPrefixPhoneModels().isEmpty();
        }
    }
    

    用法:

    ResponseValidator<PrefixPhoneModel> responseValidator = new ResponseValidator<>();
    
    responseValidator.isResponseHasErrorBody(response);
    

    【讨论】:

      【解决方案4】:

      您可以简单地省略类型参数并使用类似的方法

      private boolean isResponseHasErrorBody(Response response){
          return response != null && response.errorBody() != null;
      }
      

      你可能会像 unchecked cast 这样的 lint 警告。您可以使用 @SuppressWarnings("unchecked") 注释禁用它们

      或者你可以参数化方法,比如

      private <T extends ArrayList> boolean isResponseHasErrorBody(Response<T> response){
          return response != null && response.errorBody() != null;
      }
      

      【讨论】:

      • 这将允许任何类型的响应,而 OP 想要任何类型的 ArrayList 响应:How I can change this methods to accept any ArrayList.
      • 你能把这些方法移到另一个类还是不可能?
      猜你喜欢
      • 2014-12-12
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 2021-07-31
      • 2015-01-25
      • 2016-06-04
      • 1970-01-01
      相关资源
      最近更新 更多