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

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日

悬赏问题

  • ¥15 matlab提取运动物体的坐标
  • ¥15 人大金仓下载,有人知道怎么解决吗
  • ¥15 一个小问题,本人刚入门,哪位可以help
  • ¥15 python安卓开发
  • ¥15 使用R语言GD包一直不出结果
  • ¥15 计算机微处理器与接口技术相关问题,求解答图片的这个问题,有多少个端口,端口地址和解答问题的方法和思路,不要AI作答
  • ¥15 如何根据一个截图编写对应的HTML代码
  • ¥15 stm32标准库的PID角度环
  • ¥15 ADS已经下载好了,但是DAS下载不了,一直显示这两种情况,有什么办法吗,非常急!
  • ¥100 Excel 点击发送自动跳转outlook邮件