我有这两种方法,逻辑相同,但参数不同。如何将它们变成一个通用方法?
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/