我发现自己处于一种情况,似乎我需要能够将作为其他一些非原始类型数组的 Object 转换为其具体数组类型,以传递给泛型。对于非数组类型,同样的事情是微不足道的:desiredType.cast(o)产生一个正确类型的对象。有人会这么好心地解释如何用数组来做到这一点,或者为什么这永远行不通?我正在尝试做的演示:import java.lang.reflect.Array;import java.util.Arrays;public class Main{ public static <T> void testT(T o) { System.out.println("testT called with " + o + " (" + o.getClass() + ")"); } public static void test(Object o) { testT(o.getClass().cast(o)); } public static void main(String[] args) throws ClassNotFoundException { test(new Integer(5)); Class<?> type = Class.forName("java.lang.Integer"); Object array = Array.newInstance(type, 2); Class<?> arrayType = array.getClass(); Object[] copy = Arrays.copyOf(arrayType.cast(array), Array.getLength(array)); // NOPE. (casting is optional) System.out.println(copy); }}
2 回答

慕运维8079593
TA贡献1876条经验 获得超5个赞
Object[]
如果你想保持动态,你可以将它转换为它,它会起作用:
Object[] copy = Arrays.copyOf((Object[])arrayType.cast(array), Array.getLength(array));
在引擎盖下,它将按原样复制数组,即副本将成为Integer[]
您给定示例的一个。
如果您想要做的更通用,您还可以在转换之前检查给定类型是否实际上是一个数组,例如在您的示例中您可以使用arrayType.isArray()
它。

冉冉说
TA贡献1877条经验 获得超1个赞
我对 kotlin jvm 有疑问(它取代了Objectby Any)。typeOf因此,要将泛型转换为我从kotlin-reflect使用的数组:
private inline fun <reified T> genericReflectionToTypedArray(): T? {
return java.lang.reflect.Array.newInstance(typeOf<T>().arguments[0].type!!.javaType as Class<*>, 10) as T
}
在这种情况下,您会知道这T是一个数组,因此,要获取数组的类型,您将使用typeOf并将 java 类型作为您的第一个类型参数的类Array<T>。
该newInstance方法采用您的 Array 的 java 类型,第二个参数是数组的长度。在这种情况下,没有 UNCHECKED CAST。
添加回答
举报
0/150
提交
取消