一烛秋风 2022-12-12 10:02 采纳率: 66.7%
浏览 65
已结题

Java 一个泛型方法,如何使数组转换类型后返回泛型

我设计了一个泛型方法,使数组更改类型后返回

结果显示异常:class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.Integer;
实际上返回的是Object[]类型,请问应该如何改正?

测试代码:


        String[] cs3 = new String[] { "123", "321" };
        Integer[] cs3s = convert(cs3, Integer[].class);
        System.out.println(Arrays.toString(cs3s));
        List<Boolean> list4 = new ArrayList<>();
        list4.add(true);
        list4.add(false);
        Boolean[] list4s = convert(list4, Boolean[].class);
        System.out.println(Arrays.toString(list4s));

方法代码:


public static <T> T convert(@NotNull Object obj, Class<T> itemClass) {
        if (obj.getClass() == itemClass) return (T) obj;
        String itemClassName = itemClass.getName();
        if (itemClassName.startsWith("[")) {
            if (itemClassName.charAt(1) == 'L') {
                try {
                    Class<?> clazz = Class.forName(itemClassName.substring(2, itemClassName.length() - 1));
                    Constructor<?> type = getConstructor(clazz, "java.lang.String");
                    if (type == null) throw new TypeException("不支持的转换类型");
                    if (obj instanceof Collection) {
                        List<Object> list = ((List<Object>) obj);
                        //    Object[] result = new Object[list.size()];
                        for (int i = 0; i < list.size(); i++) {
                            list.set(i, type.newInstance(String.valueOf(list.get(i))));
                        }
                        return (T) list.toArray();
                    } else {
                        Object[] objs = ((Object[]) obj);
                        Object[] result = new Object[objs.length];
                        for (int i = 0; i < objs.length; i++) {
                            result[i] = type.newInstance(String.valueOf(objs[i]));
                        }
                        return (T) result;
                    }
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
                    throw new RuntimeException(e);
                }
            } else if (itemClassName.charAt(1) == '[') {
                throw new TypeException("不支持一维以上数组转换类型");
            } else {
                throw new TypeException("不支持基元类型转换");
            }
        } else {
            throw new TypeException("测试用,仅支持一维度数组");
        }
    }
public static Constructor<?> getConstructor(@NotNull Class<?> itemClass, @NotNull String item) {
        Constructor<?> type = null;
        for (var con : itemClass.getConstructors()) {
            Class<?>[] parameterTypes = con.getParameterTypes();
            if (parameterTypes.length == 1 && parameterTypes[0].getName().equals("java.lang.String")) {
                type = con;
            }
        }
        return type;
    }

  • 写回答

2条回答 默认 最新

  • 一烛秋风 2022-12-12 18:08
    关注

    自己已解决,以下代码,泛型数组即可返回指定数组类型:

                Object[] objs = obj instanceof Collection ? ((Collection<?>) obj).toArray() : (Object[]) obj;
                Class<?> clazz = itemClass.getComponentType();
                Object array = Array.newInstance(clazz, objs.length);
                Object[] arrays = (Object[]) array;
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月20日
  • 已采纳回答 12月12日
  • 创建了问题 12月12日

悬赏问题

  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图