在运行时将 Object[] 转换为 Class<?> 类型?

Convert an Object[] to a Class<?> type at runtime?

我遇到了很大的麻烦,这是高级的 Java(我正在使用反射 API)。

两个问题。

我有以下内容:

Class<?> clazz = String.class;
Object[] values = new Object[] { "abc", 50L, 20 } // notice the different types

我希望能够 Object[] -> clazz[]。我为什么要问这个?因为 "clazz" 的类型在运行时通过反射已知。

// This works
String[] params = Arrays.asList(values).toArray(new String[values.length]);
// This doesnt
String[] params = Arrays.asList(values).toArray(new clazz[values.length]);

还有其他事情:假设在运行时,class 是 java.lang.String。在上面创建数组的过程中,如何在每个元素上使用 String.valueOf() ?

我怎样才能做到这一点?

谢谢!

进一步解释我想要实现的目标

我有这个 class:

class A {
    public void doIt(String... params) {
        ...
    }
}

还有这个 class:

class B {
    public void doIt(Long... params) {
        ...
    }
}

如你所见,AB有相同的方法doIt()但参数类型不同。

我下面的代码会失败:

Object[] params = {1, 2, 3};
new A().doIt(params);

例外情况:

java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[]

所以,我要做的是找到 doIt() 的第一个参数的类型,并且我正在尝试将 Object[] 转换为 String/Long/Integer[]。现在更清楚了吗?

跳过关于这种编码是否产生最佳程序的评论,但回答你的问题...

您不能执行 new clazz[],因为 Java 中的 new 采用 class 名称,而不是计算结果为 Class 对象的表达式。 更实用地说:new String[10]new String.class[10] 不同。后者是您的示例所做的。并且根本不受支持。

您在寻找 Array.newInstance(Class<?>, int) 吗?这就是用 Class 对象而不是编译时类型反射性地构建数组的方法。

你不能写new clazz[values.length],但你可以写Array.newInstance(clazz, values.length)

你可以做到 Array.newInstance(clazz, values.length),这似乎就是你想要做的。但我看不出它对你有什么帮助。如果数组的元素是不同的类型,并且您最终得到一个字符串数组(尽管是动态创建的),那么无论如何您都无法将所有元素放入其中。