Приведение к типу массива с использованием отражения - PullRequest
0 голосов
/ 29 января 2019

Я нахожусь в ситуации, когда кажется, что мне нужно иметь возможность преобразовать Объект, который является массивом какого-то другого, не примитивного типа, в его конкретный тип массива, чтобы перейти к универсальному.

То же самое тривиально для работы с типами, не относящимися к массивам: 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);
  }
}

1 Ответ

0 голосов
/ 29 января 2019

Вместо этого вы можете привести его к Object[], если хотите сохранить его динамичным, и он будет работать:

Object[] copy = Arrays.copyOf((Object[])arrayType.cast(array), Array.getLength(array));

Под капотом он скопирует массив как есть, то есть копия станетInteger[] для вашего данного примера.

Если это еще более универсально, что вы хотите сделать, вы также можете проверить, является ли данный тип массивом, перед приведением, например, в вашем примере вы можете использовать arrayType.isArray() для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...