zoukankan      html  css  js  c++  java
  • 【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;
        }
  • 相关阅读:
    (一)SpringCloud Alibaba Nacos服务注册和配置中心:Nacos简介
    (八)SpringCloud初级篇——Eureka服务注册与发现:服务发现Discovery
    (七)SpringCloud初级篇——Eureka服务注册与发现:actuator微服务信息完善
    (六)SpringCloud初级篇——Eureka服务注册与发现:集群Eureka构建步骤
    Windows系统修改Hosts文件
    (五)SpringCloud初级篇——Eureka服务注册与发现:单机Eureka构建步骤
    centos7 安装zookeeper
    热部署Devtools
    【阅读笔记】《C程序员 从校园到职场》第三章 程序的样式(版式和注释)
    【阅读笔记】《C程序员 从校园到职场》第二章 学校到职场
  • 原文地址:https://www.cnblogs.com/mindzone/p/14831184.html
Copyright © 2011-2022 走看看