我试图找出如何检查数组的组件类型是否实现Comparable,如果是,则对数组进行排序。这就是我所拥有的:
if (prop1.getClass().isArray())
{
if (!(Array.getLength(prop1) == Array.getLength(prop2)))
throw new AssertionError(objectName + "." + propertyName + "'s aren't the same length!");
int len = Array.getLength(prop1);
if (0 == len)
return;
List list1 = Arrays.asList(prop1);
List list2 = Arrays.asList(prop2);
// class names of objects in arrays are weird
String componentClassName = StringUtils.remove(StringUtils.remove(list1.get(0).getClass().getName(), "[L"), ';');
Class componentClazz = null;
try
{
componentClazz = Class.forName(componentClassName);
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
if (Comparable.class.isAssignableFrom(componentClazz))
{
Collections.sort(list1);
Collections.sort(list2);
当prop1
是一个字符串数组时,第一个排序引发异常:
java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.Comparable
答案 0 :(得分:3)
prop1
是类型Object
,因此Arrays.asList(prop1)
返回一个元素的列表,对象也就是数组。当您尝试对列表进行排序时,它理所当然地抱怨该元素(实际上是某个数组)不是Comparable
。
至于获取数组元素类型,您不能查看第一个元素,因为它可能是数组元素类型的子类。只需致电prop1.getClass().getComponentType()
。
要对数组进行排序,请调用Arrays.sort(a)
的8个重载之一。要调用哪一个取决于组件类型。
如果您不允许修改原始数组,请先将其克隆。
<强>更新强>
当我说'#34;取决于组件类型&#34;时,我的意思是你必须检查类型,并调用正确的版本。选择重载方法的版本是在编译时完成的,因此必须静态完成。 (好吧,另一层反射是另一种选择)
Class<?> compType = prop1.getClass().getComponentType();
if (compType == int.class)
Arrays.sort((int[])prop1);
else if (compType == float.class)
Arrays.sort((float[])prop1);
// ... 5 more ...
else if (Comparable.class.isAssignableFrom(compType))
Arrays.sort((Comparable[])prop1);
else
throw new UnsupportedOperationException("Cannot sort array of " + compType.getName());