集合类中的泛型相关
看个例子
java.util.Collection<E> extends Iterable<E> {
Object[] toArray();
}
分析
当时看到这里的时候,心里不免有些产生疑惑,为何不直接定义元素类型的toArray呢:
E[] toArray();
遂自己重定义一个仿Conllection接口
test.java.util.Collection<E> extends Iterable<E> {
E[] toArray();
}
但是,在写实现类的时候出现了问题:
abstract class AbstractCollection<E> implements Collection<E> {
public E[] toArray() {
E[] r = new E[size()];
Iterator<E> it = iterator();
for(int i=0; i < r.length; i++) {
if(!it.hasNext())
return Arrays.copyOf(r, i);
r[i] = it.next();
}
return it.hasNext() ? finishToArray(r, it) : r;
}
}
这样看起来形式很美, 但是new E[size()] 有错误:Cannot create a generic array of E(不能创建类型为E的泛型数组),这是底层设计决定了,所以原代码用的是Object[] toArray();,想到的解决方法就是类型强制转换
E[] r = (E[]) new Object[size()];
不知这样可行不