如何使这两个java方法通用

时间:2018-01-02 03:33:03

标签: java arrays generics arraylist

我有这两种方法具有相同的逻辑,但参数不同。如何将它们组合成一种通用方法?

boolean exists(int[][] roads, int[] road){
    for(int[] r: roads){
       // code
    }
    return false;
}

boolean exists(ArrayList<int[]> roads, int[] road){
   for(int[] r: roads){
      // code
   }
    return false;
}

我想做这样的事情

<T> boolean exists(Collection<T[]> roads, T[] road){ 
    for(T[] r: roads){
         if(r[0] == road[0])
             return true; 
    }

    return false;
}

我遇到类似错误,如:

required: Collection<T[]>,T[]
  found: int[][],int[]
  reason: cannot infer type-variable(s) T
    (argument mismatch; int[][] cannot be converted to Collection<T[]>)
  where T is a type-variable:
    T extends Object declared in method <T>exists(Collection<T[]>,T[])

我也试过了其他几个签名,但他们也没有做过

  • <T,F> boolean exists(F<T[]> roads, T[] road)

  • <T,F> boolean exists(F<? extends Object> roads, T[] road)

2 个答案:

答案 0 :(得分:4)

Java类型参数化无法为您提供将数组视为Arrays.asList()反之亦然的任何方法。首先需要普通多态的基础,并且数组类型不具有适合于所需多态实现的非数组类型的任何超类型。

我的建议是直接支持2D数组作为参数。如果客户端有一个他们想要传递给您的方法的2D数组,让他们使用List<int[]>获取一个Arrays.asList(),他们可以将其传递给该方法的基于Collection的版本(但请阅读List的文档,以获取有关此特定{{1}}实施的限制的信息。

答案 1 :(得分:0)

没有类型安全的方法来做到这一点。您可以创建一个方法:

DataTable

并且执行instanceOf检查和强制转换,但是你失去的比你获得的更多。