Java通用基元类型n-d数组

Java通用基元类型n-d数组,java,arrays,generics,Java,Arrays,Generics,我必须将一个基本的2d数组传递给一个过滤例程。过滤算法(中值滤波)无论数组的类型如何,都是相同的。是否有方法以通用方式传递任何类型的数组,或者是否应使用不同的数组类型重载相同的函数。在第二种情况下,必须为不同的数据类型重复相同的代码 int[][] medianfilter(int[][] arr){ ... } float[][] medianfilter(float[][] arr){ ... } 有没有办法使上述代码成为通用代码,而不是在每个重载函数中重复medianfilter的代码

我必须将一个基本的2d数组传递给一个过滤例程。过滤算法(中值滤波)无论数组的类型如何,都是相同的。是否有方法以通用方式传递任何类型的数组,或者是否应使用不同的数组类型重载相同的函数。在第二种情况下,必须为不同的数据类型重复相同的代码

int[][] medianfilter(int[][] arr){ ... }
float[][] medianfilter(float[][] arr){ ... }

有没有办法使上述代码成为通用代码,而不是在每个重载函数中重复medianfilter的代码

以通用方式传递它并将其保持为基本数组的唯一方法是将其作为
对象
。就我个人而言,我只是让它过载,并将其视为使用原语的成本

为了避免算法中的代码重复(如果代码太多),您可以生成一个名为
DoubleAlgorithm
的抽象类,使用
double getElement(inti,intj)
handleResult(double result)
等抽象方法,然后编写该类的非常小的子类,每个基元类型一个

让我用一个例子来解释(假设算法是添加数字)

public int filter(int[][]值){
算法算法=新算法(值);
算法运行();
返回algo.getResult();
}
公共双筛选器(双[][]值){
DoubleAlgorithm algo=新的DoubleAlgorithm(值);
算法运行();
返回algo.getResult();
}
公共类抽象算法{
公营{
双和=0.0;

对于(inti=0;i来说,对于基本数组没有很好的方法来实现这一点,这就是为什么所有库函数(比如java.util.array)也有这些重复的方法

您可以定义一个方法

Object[] medianfilter(Object[] arr); // note the missing dimension
并使用反射查找运行时类型。System.arraycopy就是这样做的。但是您需要键入cast.ught

int[][]  result = (int[][]) medianFilter( input );

使用复制的方法。

有一种方法可以以通用方式传递数组类型:

public T test(T[][] arg)
{
    T[][] q = arg;
    T[]   r = q[0];
    T     s = r[0];

    return s;
}

…不幸的是,它不适用于基本类型。您需要使用Integer和Float作为参数化类型。

他可以将其作为Object[](一维)传入你能为你建议的第二部分提供一个代码示例吗?完成了。我甚至还没有编译这个,但希望你能得到这个想法。我不太确定我会想用双精度计算int[]和long[。如果他想避免重复代码,他必须用双精度计算,除非他开始使用“Summable”接口或类似接口,它变得更加复杂。作为双精度运算进行int或long计算是否可行取决于算法,我希望在大多数情况下,对于中值滤波器,它将是精细的。最后一句话,我讨厌那些重复:-)+1更好:不要编写重复的代码,编写一个脚本为您完成。理想情况下,您可以在构建过程中自动生成它,但我想这不是经常更改的代码,所以每次更改实现细节时手动运行脚本可能没那么糟糕。不要搞乱您的build过程,除非绝对必要。
public T test(T[][] arg)
{
    T[][] q = arg;
    T[]   r = q[0];
    T     s = r[0];

    return s;
}