Как привести массив объекта к произвольному типу содержимого T (Object [] -> T []) - PullRequest
0 голосов
/ 24 апреля 2019

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

Что я уже пробовал:

//  T[]  <-       Object[] 
    arr = (T[]) cache.toArray();

и

    T[] a = new T[6]; // Cannot create a generic array of T
    int index = 0;
    for (T i : arr) {
     a[++index] = i;
    }

Код:

public StreamParser<T> forEach(Consumer<? super T> action) {
        ArrayList<T> cache = new ArrayList<T>();
        for (T i : arr) {
            action.accept(i);
            cache.add(i);
        }
        System.out.println(arr instanceof String[]);
        arr = (T[]) cache.toArray();
        System.out.println(arr instanceof String[]);
        return this;
    }

Вывод:

true
false

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Вы должны использовать второй метод toArray с дополнительным параметром.Вот ссылка на javadoc: https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#toArray%28java.lang.Object%5B%5D%29

Что касается создания универсального массива, вот трюк, необходимый для этого:

public static <T> T[] genArray(Class<T> clazz, int size){
    return (T[]) Array.newInstance(clazz, size);
}

, что означает дополнительный шаг квыполнить, для которого вам нужен фактический класс, соответствующий этому T параметру

0 голосов
/ 24 апреля 2019

ArrayList.toArray() всегда возвращает ровно Object[], а не какой-либо подтип.

Чтобы это работало, вам нужно передать T[] или IntFunction<T[]> в качестве параметра (либо в конструкторStreamParser (или методу), и используйте это в вызове toArray():

arr = cache.toArray(someIntFn.apply(0 /* or cache.size() */));
// Or
arr = cache.toArray(someArray);
...