猿问

使用反射转换为数组类型

我发现自己处于一种情况,似乎我需要能够将作为其他一些非原始类型数组的 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);

  }

}


慕妹3146593
浏览 127回答 2
2回答

慕运维8079593

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

冉冉说

我对 kotlin jvm 有疑问(它取代了Objectby Any)。typeOf因此,要将泛型转换为我从kotlin-reflect使用的数组:private inline fun <reified T> genericReflectionToTypedArray(): T? {&nbsp; &nbsp; 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。
随时随地看视频慕课网APP

相关分类

Java
我要回答