如何将对象数组转换为任意内容类型T(Object []-> T [])

时间:2019-04-24 12:20:10

标签: java arrays casting stream content-type

我想创建自己的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 :(得分:0)

ArrayList.toArray()始终准确返回Object[],从不返回任何子类型。

要使其正常工作,您需要将T[]IntFunction<T[]>作为参数(传递给StreamParser的构造函数或方法),并在其中使用toArray()呼叫:

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

答案 1 :(得分:0)

您应该使用第二个方法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参数