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?
答案 0 :(得分:1)
您的代码看起来非常好,但您可以考虑使用java.util.Arrays.copyOf
来简化您的生活。