Универсальный вектор в строго типизированный массив - PullRequest
0 голосов
/ 01 марта 2012

У меня есть метод, который возвращает мне общий Vector с некоторыми данными.Как я могу получить тип этого вектора детей во время выполнения?Последний день я провожу, пытаясь найти решение в документации по Java и в Google.Когда я пытаюсь сделать то есть:

Vector<String> myVector = new Vector<String>();
//here I fill array with data
.......
// here I my code don't know now what is element type of 
// myVector and need to get it in some way
Class<?> baseClass = myVector.toArray().getClass().getComponentType();

Последняя строка возвращает меня Object.

1 Ответ

0 голосов
/ 01 марта 2012

Универсальные типы параметров, такие как <String>, существуют только во время компиляции и получат стирание типа , поэтому остается только Object.

Хорошо, можно выбрать наиболее специализированный общий класс:

public Class<?> commonComponentClass(Collection<?> collection) {
    Class<?> klazz = null;
    for (Object item : collection) {
        if (item == null)
            continue;
        Class<?> itemKlazz = item.getClass();
        if (klazz == null) {
            klazz = itemKlazz;
        } else {
            while (klazz != itemKlazz) {
                if (itemKlazz.isAssignableFrom(klazz)) {
                    klazz = itemKlazz;
                    break;
                } else if (klazz.isAssignableFrom(itemKlazz)) {
                    break;
                }
                if (itemKlazz != Object.class)
                    itemKlazz = itemKlazz.getSuperclass();
                if (klazz != Object.class)
                    klazz = klazz.getSuperclass();
            }
        }
    }
    if (klazz == null) {
        klazz = Object.class;
    }
    return klazz;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...