【Java】数组强转问题
问题产生
问题代码:
List<String> strs = new LinkedList<String>(); // 中间有添加元素的操作,这里省略... // 这里toArray方法不会返回String类型的数组,但是写的时候不知道 Object[] objs = strs.toArray(); // 然后参数需要一个String数组类型 void someMethod(xx param1, String[] fieldNames, xxx param2, ...) // 入参就给的强转了 someMethod(p1, (String[]) objs, p2);
运行就会报错,报错信息:
Exception in thread “main” java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
细节分析参考:
https://blog.csdn.net/xxxxxxxxxxxyn/article/details/97694144
解决方案:
第一种,调用 toArray的重载:
List<String> fieldNames = new LinkedList<>(); // 省略元素装填过程 String[] strings = new String[fieldNames.size()]; String[] strings1 = fieldNames.toArray(strings);
第二种,差不多意思,就自己来操作元素装填
List<String> fieldNames = new LinkedList<>(); colList.forEach(item -> { fieldNames.add(item.getFieldName()); }); Object[] objects = fieldNames.toArray(); String[] strings = new String[objects.length]; for (int i = 0; i < objects.length; i++) { strings[i] = objects[i].toString(); }
调用toArray的重载时,注意源码的操作:
/** * Returns an array containing all of the elements in this list in proper * sequence (from first to last element); the runtime type of the returned * array is that of the specified array. If the list fits in the * specified array, it is returned therein. Otherwise, a new array is * allocated with the runtime type of the specified array and the size of * this list. * * <p>If the list fits in the specified array with room to spare * (i.e., the array has more elements than the list), the element in * the array immediately following the end of the collection is set to * <tt>null</tt>. (This is useful in determining the length of the * list <i>only</i> if the caller knows that the list does not contain * any null elements.) * * @param a the array into which the elements of the list are to * be stored, if it is big enough; otherwise, a new array of the * same runtime type is allocated for this purpose. * @return an array containing the elements of the list * @throws ArrayStoreException if the runtime type of the specified array * is not a supertype of the runtime type of every element in * this list * @throws NullPointerException if the specified array is null */ @SuppressWarnings("unchecked") public <T> T[] toArray(T[] a) { if (a.length < size) // Make a new array of a's runtime type, but my contents: return (T[]) Arrays.copyOf(elementData, size, a.getClass()); System.arraycopy(elementData, 0, a, 0, size); if (a.length > size) a[size] = null; return a; }