制作通用函数(用于基元和对象)

时间:2015-05-13 13:54:33

标签: java generics overloading primitive

我正在创建一个Java函数 randomize ,它获取一个参数,一个对象数组。 基本上,此函数使整个数组随机化,并且由于数据类型不相关,因此方法签名为:public static Object[] randomize(Object[] array)。 但是,这不适用于int,double等数组。(因此对于基元数组)。我怎样才能让它发挥作用?我不想为每个基本类型提供一个对象函数和8个重载函数。如果Object数组有一个函数,所有基本类型都有一个函数,我可以接受。我怎么能这样做?

谢谢你, 埃克托

4 个答案:

答案 0 :(得分:1)

该算法可以创建索引的排列。 某些操作如Arrays.sort已在通用基础上提供。 但一般来说,只有在不操纵xxx[]的情况下才能使用反射,这是很昂贵的。

int[] intArray = new int[10];
randomize(intArray);

void randomize(Object array) {
    if (array == null || array.getClass().isArray()) {
        throw new IllegalArgumentException();
    }
    ... use reflection
}

答案 1 :(得分:1)

可以编写一种方法,该方法可以在原始数组和引用数组上运行,而无需复制代码。但是,您将失去类型安全性。该方法将采用并返回Object,因为它是原始数组和引用数组的唯一超类型:

public static Object randomize(Object array) {

然后,在方法内部,您可以使用java.lang.reflect.Array类中的方法对数组执行操作。您可以在数组上使用Array.get()Array.set()Array.length(),而不是数组访问运算符和长度字段。这些方法透明地用于原始数组和引用数组。如果需要创建一个与旧的数组具有相同运行时类的新数组,则可以将Array.newInstance()与传入数组中的运行时组件类型一起使用:

Array.newInstance(array.getClass().getComponentType(), N)

答案 2 :(得分:0)

正如你所说的int是一个原语而不是一个Object,所以你可以做的是使用(例如)Integer(int的包装类)来构建整数数组,但这需要你在调用之前这样做那种方法。您可以搜索包装类以获取所需的所有类。

答案 3 :(得分:0)

作为最后的手段,您可以使用Object作为数组的参数声明方法,然后在运行时检查类型。然后,您可以在方法中确定并转换数组类型,或使用其他一些util库为您执行此操作。