Java自从引入泛型后,对整个Java编程带来了巨大的变化。现在写类和方法应该都尽量写成类型安全的。
1:构建泛型类
如果要构建一个容器,可以存放各类对象,要怎么办呢?在Java里面是不能构建泛型数组的,常用的解决方案就是用Object数组来代替,而用泛型来对其进行控制。看Vector是如何实现的:
protected Object[] elementData;
这就是vector用来存放数据的数组,构造函数如下:
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
下面是如何添加一个元素:
public synchronized void addElement(E obj) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = obj;
}
而获得vector里面元素的实现则如:
public synchronized E get(int index) {
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
return (E)elementData[index];
}
注意需要使用类型转换(E)elementData[index]。
2:协变性
前面的日志里说过,数组时协变的,而泛型的容器则是非协变的。
也就是说Set<Number>和Set<Integer>之间没有任何关系。
那么如下的:
pushAll(Iterable<E>src){//简写
for(E e:src)
push(e);
}
Stack<Number>s=new Stack<Number>();
Iterable<Integer>iter=....
s.push(iter)
这时候编译的时候会出现错误.....
这就是不协变带来的麻烦。针对这个问题,Java引入了有限制通配符来解决这个问题,可以将pushAll函数改为如下形式就可以了:
pushAll(Iterable<? extends E>src){//简写
for(E e:src)
push(e);
}
这样就可以了