java - 如何使这两个java方法通用

标签 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)

最佳答案

Java 类型参数化无法提供任何方法让您将数组视为 Collection反之亦然。您首先需要一个普通多态性的基础,并且数组类型与非数组类型没有任何共同的父类(super class)型,而这些父类(super class)型适合您想要的多态实现。

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

关于java - 如何使这两个java方法通用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48055298/

相关文章:

java - 如何在 Eclipse 中设置命令行参数?

javascript - 如何使 HTML 表格使用 PHP 数组

javascript - 从数组中过滤数据

c# - 如何修改并保留 "dynamic"对象中的成员/嵌入数组(使用dynamic关键字声明的对象)

Java 泛型和流

java - 我通过泛型声明了 String 的 ArrayList,但以某种方式用 Integer 填充了它。我破坏了java吗?

java - 如何使用 java 在属性文件中创建新行?

Java JSTL 拆分函数正则表达式

java - 如何消除此消息错误 : Main method not found in class

c - 如何将 char 数组作为参数传递给 C 中的函数?