Java泛型的几点

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);
}

这样就可以了

原文地址:https://www.cnblogs.com/macula7/p/1960488.html