В Java, как я могу динамически определить тип массива? - PullRequest
35 голосов
/ 17 октября 2008
Object o = new Long[0]
System.out.println( o.getClass().isArray() )
System.out.println( o.getClass().getName() )
Class ofArray = ???

Запуск первых 3-х строк;

true
[Ljava.lang.Long;

Как мне получить ??? быть долго типа? Я мог бы разобрать строку и сделать Class.forname (), но это ужасно. Какой легкий путь?

Ответы [ 3 ]

66 голосов
/ 17 октября 2008

Просто напишите

Class ofArray = o.getClass().getComponentType();

С JavaDoc :

public Class<?> getComponentType()

Возвращает Class, представляющий тип компонента массива. Если этот класс не представляет класс массива, этот метод возвращает null.

21 голосов
/ 17 октября 2008

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#getComponentType():

public Class<?> getComponentType()

Возвращает Class, представляющий тип компонента массива. Если этот класс не представляет класс массива, этот метод возвращает нуль ...

6 голосов
/ 17 октября 2008

@ ддимитров - правильный ответ. Вставьте в код это выглядит так:

public <T> Class<T> testArray(T[] array) {
    return array.getClass().getComponentType();
}

В более общем смысле, мы можем сначала проверить, представляет ли тип массив, и затем получить его компонент:

Object maybeArray = ...
Class<?> clazz = maybeArray.getClass();
if (clazz.isArray()) {
    System.out.printf("Array of type %s", clazz.getComponentType());
} else {
    System.out.println("Not an array");
}

Конкретным примером будет применение этого метода к массиву, для которого тип компонента уже известен:

String[] arr = {"Daniel", "Chris", "Joseph"};
arr.getClass().getComponentType();              // => java.lang.String

Довольно просто!

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