关于基元数组的Java泛型方法代码重复问题

关于基元数组的Java泛型方法代码重复问题,java,arrays,constructor,code-duplication,Java,Arrays,Constructor,Code Duplication,因此,我正在为一个小型的个人实用程序库开发一个网格类的实现。在做了大量工作之后,我正在整理Grid类并添加一些功能。我希望在Grid类中使用的关键功能之一是能够将任何给定类型的单个2D数组作为构造函数的参数 在我意识到我无法编译任何试图将任何基元数组传递给构造函数的代码之前,这一切都很好。由于自动装箱不会发生在基元数组上,这给我带来了代码重用形式的设计问题。不管传入的数组类型如何,初始化网格的方法都是相同的,即使它们是基元,但似乎我需要为所有不同类型的基元编写一个单独的构造函数。这就给了我9个不

因此,我正在为一个小型的个人实用程序库开发一个网格类的实现。在做了大量工作之后,我正在整理Grid类并添加一些功能。我希望在Grid类中使用的关键功能之一是能够将任何给定类型的单个2D数组作为构造函数的参数

在我意识到我无法编译任何试图将任何基元数组传递给构造函数的代码之前,这一切都很好。由于自动装箱不会发生在基元数组上,这给我带来了代码重用形式的设计问题。不管传入的数组类型如何,初始化网格的方法都是相同的,即使它们是基元,但似乎我需要为所有不同类型的基元编写一个单独的构造函数。这就给了我9个不同的构造函数,假设我只使用我的基本构造函数(我计划让构造函数具有不同的参数,比如网格包装选项)

我认为没有办法避免所有这些代码重复,这是对的吗

使用
Array
class可以避免(大部分)重复。但这并不漂亮:构造函数参数的类型应该是
对象
,您只需信任调用方将实际数组传递到那里,而不是
套接字
属性

例如,您可以像这样进行自己的拳击:

<T> public T[][] boxArray(Class<T> clazz, Object array) {
    int height = Array.getLength(array);
    int width = height == 0 ? 0 : Array.getLength(Array.get(array, 0));
    T[][] result = (T[][]) Array.newInstance(clazz, height, width);
    for(int i = 0; i < height; i ++) {
        Object a = Array.get(array, i);
        for(int j = 0; j < width; j++) {
            result[i][j] = (T) Array.get(a, j); 
        }
    }
    return result;
}
public T[]boxArray(类clazz,对象数组){
int height=Array.getLength(数组);
int-width=height==0?0:Array.getLength(Array.get(Array,0));
T[][]结果=(T[][])数组.newInstance(clazz,height,width);
对于(int i=0;i
您可以使用
数组
类来避免(大部分)重复。但这并不漂亮:构造函数参数的类型应该是
对象
,您只需信任调用方将实际数组传递到那里,而不是
套接字
属性

例如,您可以像这样进行自己的拳击:

<T> public T[][] boxArray(Class<T> clazz, Object array) {
    int height = Array.getLength(array);
    int width = height == 0 ? 0 : Array.getLength(Array.get(array, 0));
    T[][] result = (T[][]) Array.newInstance(clazz, height, width);
    for(int i = 0; i < height; i ++) {
        Object a = Array.get(array, i);
        for(int j = 0; j < width; j++) {
            result[i][j] = (T) Array.get(a, j); 
        }
    }
    return result;
}
public T[]boxArray(类clazz,对象数组){
int height=Array.getLength(数组);
int-width=height==0?0:Array.getLength(Array.get(Array,0));
T[][]结果=(T[][])数组.newInstance(clazz,height,width);
对于(int i=0;i
我不明白您所说的
自动装箱在基元数组上不发生是什么意思
;任何数组都是对象,可以用于泛型类型。介意展示你的代码吗?我不确定我是否正确理解您的意思,您可以使用来避开伸缩构造函数。@Vince Emigh自动装箱不会发生在中的基元数组上,因此int[]类型的数组不能被编译器解释为Object[]类型的数组。由于int、double、char、boolean等都是原语,所以它们不扩展对象。作为一个数组,值不会像只传递一个基元值时那样自动转换为它们的值对象对应项,如整数或字符。但是您不能执行
构造函数(t数组)
然后调用
新构造函数(new int[5])
?@Eddie B我没有想到使用Builder模式进行伸缩。我还在学习所有的设计模式。谢谢你的提示!我不明白你所说的
自动装箱在基本数组上不发生是什么意思
;任何数组都是对象,可以用于泛型类型。介意展示你的代码吗?我不确定我是否正确理解您的意思,您可以使用来避开伸缩构造函数。@Vince Emigh自动装箱不会发生在中的基元数组上,因此int[]类型的数组不能被编译器解释为Object[]类型的数组。由于int、double、char、boolean等都是原语,所以它们不扩展对象。作为一个数组,值不会像只传递一个基元值时那样自动转换为它们的值对象对应项,如整数或字符。但是您不能执行
构造函数(t数组)
然后调用
新构造函数(new int[5])
?@Eddie B我没有想到使用Builder模式进行伸缩。我还在学习所有的设计模式。谢谢你的提示!我不知道
数组。get
存在。我不建议OP真的这么做(他的类应该是泛型的),但是+1的巧妙之处,现在可以用了。非常感谢。但一旦我向更多的公众发布它(一旦我打开了我的库的源代码),我将不得不切换回多个构造函数。对于一个开放项目,在类型安全方面,我将采用两害相权取其轻的代码复制。但对于个人项目,这是可行的。通过让多个公共单行构造函数使用基本数组,它们最终都会调用同一个私有数组,包含在
数组
上操作的公共逻辑,您可以使它有点类型安全。反正我也会这么做的。(为了记录在案,我强烈反对,代码重复对于类型(un)安全来说是一个“较小的邪恶”。我不知道
Array.get
的存在。我不建议OP真的这么做(他的类应该是泛型的),但是+1的巧妙之处,现在可以用了。非常感谢。但一旦我向更多的公众发布它(一旦我打开了我的库的源代码),我将不得不切换回多个构造函数。对于一个开放项目,我将采用以下较小的代码复制