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