在运行时将 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) {
...
}
}
如你所见,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[]。现在更清楚了吗?
跳过关于这种编码是否产生最佳程序的评论,但回答你的问题...
您不能执行 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)
,这似乎就是你想要做的。但我看不出它对你有什么帮助。如果数组的元素是不同的类型,并且您最终得到一个字符串数组(尽管是动态创建的),那么无论如何您都无法将所有元素放入其中。
我遇到了很大的麻烦,这是高级的 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) {
...
}
}
如你所见,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[]。现在更清楚了吗?
跳过关于这种编码是否产生最佳程序的评论,但回答你的问题...
您不能执行 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)
,这似乎就是你想要做的。但我看不出它对你有什么帮助。如果数组的元素是不同的类型,并且您最终得到一个字符串数组(尽管是动态创建的),那么无论如何您都无法将所有元素放入其中。