现在,我有:的Java:如何实现`toArray`为`Collection`
public <T> T[] toArray(T[] old) {
T[] arr = Arrays.copyOf(old, old.length + size());
int i = old.length;
for(E obj : this) {
arr[i] = old.getClass().getComponentType().cast(obj);
++i;
}
return arr;
}
(请注意,这不符合合同有人指出,通过axtavt。)
我得到这个警告:
Type safety: Unchecked cast from capture#2-of ? to T
这仍然是实施它的最好/最直接的方法吗?我能以某种方式编写代码而没有发出警告吗?否则我将如何实施?
编辑:我目前的解决方案。首先,我真的不想在toArray
本身有这样的警告。因此,我编码(有关这些的进一步讨论read here),这些小助手功能:
@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;
}
你要集合在签名的地方? –
2010-10-24 23:08:33
你所能做的只是转换为(T),而cast()方法只改变引用的类型,它不会改变引用的对象的类型。 – 2010-10-24 23:41:10