所以我想创建一个方法来验证两个数组的长度相同,如:
validateSameSize(Object[] first, Object[] second) {
if (first.length != second.length) throw new Exception();
}
问题在于此方法仅适用于非原始数组。如果我想将char
数组与另一个数组进行比较,则不起作用。有没有办法在没有太多开销的情况下实现此功能?
我已经尝试过
<T,V> validateSameSize(T[] first, V[] second)
但是由于泛型也需要一个类并且不能与原始类型一起使用,因此这是行不通的。还有
validateSameSize(Array first, Array second)
也不起作用
答案 0 :(得分:9)
您可以使用Array#getLength
:
public static boolean sameSize(Object arrayA, Object arrayB) {
return Array.getLength(arrayA) == Array.getLength(arrayB);
}
它适用于非基本数组以及原始数组:
System.out.println(sameSize(new int[0], new int[100])); // false
System.out.println(sameSize(new char[0], new int[0])); // true
System.out.println(sameSize(new Object[0], new Object[0])); // true
System.out.println(sameSize(new Object[0], new List[0])); // true
也不要忘记将不是数组的Object
传递到Array#getLength
会导致IllegalArgumentException
。
此代码:
Object notArray = 100;
System.out.println(Array.getLength(notArray));
产生:
Exception in thread "main" java.lang.IllegalArgumentException: Argument is not an array
如果需要在调用Array#getLength
之前快速失败,则可以检查参数是否为实际上数组:
if (!object.getClass().isArray()) {
// object is not array. Do something with it
}
答案 1 :(得分:3)
caco3的答案很好。
请注意,如果Object
参数不是数组,则只能在运行时发现它。
一种更安全的方法是重载基元的方法:
void validateSameSize(Object[] first, Object[] second) throws Exception {
if (first.length != second.length) throw new Exception();
}
void validateSameSize(int[] first, int[] second) throws Exception {
if (first.length != second.length) throw new Exception();
}
等等...
这将需要您编写更多代码,但您的代码会更健壮。