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

时间:2015-01-08 22:45:18

标签: java arrays

我遇到了很多麻烦,这是高级Java(我正在使用Reflection API)。

两个问题。

我有以下内容:

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

我希望能够对象[] - &gt; clazz中[]。我为什么这么问?因为&#34; clazz&#34;的类型在运行时通过反射知道。

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

还有别的东西:让我们说,在运行时,类是java.lang.String。在上面创建数组的过程中,如何在每个元素上使用String.valueOf()?

我怎样才能做到这一点?

谢谢!

详细解释我想要实现的目标

我有这堂课:

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

还有这堂课:

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

如您所见, A B 具有相同的方法 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 []。现在更清楚了吗?

3 个答案:

答案 0 :(得分:2)

删除关于这种编码是否产生最佳节目的评论,但回答你的问题...

你无法做new clazz[],因为Java中的new需要一个类名,而不是一个评估为Class对象的表达式。 更实际:new String[10]new String.class[10]不同。后者就是你的榜样。并且根本不受支持。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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