首页 > 技术文章 > 【Java】数组强转问题

mindzone 2021-05-31 13:57 原文

问题产生

问题代码:

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;
    }

 

推荐阅读