Java:我的classOf和newArray怎么样?

时间:2010-10-25 01:07:25

标签: java generics reflection

Here,我想知道如何正确实施Collection#toArray(T[] array)。我对array.getClass().getComponentType()类型为Class<?>而不是Class<? extends T>感到非常恼火。正如我所期望的那样。

因此,我编写了这三个函数:

@SuppressWarnings("unchecked") static <T> Class<? extends T> classOf(T obj) {
    return (Class<? extends T>) obj.getClass();
}

@SuppressWarnings("unchecked") static <T> Class<? extends T> classOf(T[] array) {
    return (Class<? extends T>) array.getClass().getComponentType();
}

@SuppressWarnings("unchecked") static <T> T[] newArray(Class<T> clazz, int size) {
    return (T[]) Array.newInstance(clazz, size);
}   

然后,我的toArray实现如下:

    public <T> T[] toArray(T[] array) { 
        int size = size();
        if (array.length < size) { 
            array = newArray(classOf(array), size);
        } else if (array.length > size) {
            array[size] = null;
        }

        int i = 0;
        for (E e : this) {
            array[i] = classOf(array).cast(e);
            i++;
        }
        return array;
    } 

我现在想知道的是:

这3个辅助功能总是安全吗?特别是,演员总是安全吗?

为什么这些函数不在Java中?

另请参阅以下相关问题:T obj for a generic type T. The type of obj.getClass() is Class<?> and not Class<? extends T>. Why?

1 个答案:

答案 0 :(得分:1)

您的代码看起来非常好,但您可以考虑使用java.util.Arrays.copyOf来简化您的生活。