泛型的定义
指参数化类型,单从字面上的定义我们觉得时一脸疑惑,但是我们在学习java过程中有形参(定义方法括号内自定义的参数)和实参(调用方法时传递的参数);而参数化类型,举个例子:
出现编译错误,从这段代码中我们更深理解泛型了,泛型就是将原来的具体的类型String进行参数化:
ArrayList<String> list = new ArrayList<>();
,然后在使用list,调用其方法时传入具体的类型,限定了传入实际参数的类型;
泛型的表现形式
泛型会以哪些表现形式出现呢?既然操作的数据类型被指定为一个参数类型,那我们可以让它用在类、接口和方法当中
泛型类:ArrayList部分源码
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); if ((size = elementData.length) != 0) { // c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); } else { // replace with empty array. this.elementData = EMPTY_ELEMENTDATA; } }
public E get(int index) { if (index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); return (E) elementData[index]; }
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
}
ArrayList属于泛型类,它的add方法中传入的<E>类型,限定了add添加的数据类型。
泛型接口:我们来看看List源码
public interface List<E> extends Collection<E> {
Iterator<E> iterator();
default void replaceAll(UnaryOperator<E> operator) { Objects.requireNonNull(operator); final ListIterator<E> li = this.listIterator(); while (li.hasNext()) { li.set(operator.apply(li.next())); } }
static <E> List<E> of() { return ImmutableCollections.List0.instance(); }
default void sort(Comparator<? super E> c) { Object[] a = this.toArray(); Arrays.sort(a, (Comparator) c); ListIterator<E> i = this.listIterator(); for (Object e : a) { i.next(); i.set((E) e); } }
@Override default Spliterator<E> spliterator() { if (this instanceof RandomAccess) { return new AbstractList.RandomAccessSpliterator<>(this); } else { return Spliterators.spliterator(this, Spliterator.ORDERED); } }
...
}
泛型类和泛型接口定义相类似,都是在其后面定义<T>,<K, V>等,new对象时跟普通的类没区别;
泛型方法:是在调用方法的时候指明泛型的具体类型 ,泛型方法无固定的使用场景,没有过多限制,在普通类和泛型类都可以使用。不过需要注意泛型类中定义的普通方法和泛型方法的区别。
泛型方法中一定在修饰符返回值T或者void中,泛型方法中<>内也可以有多个参数<K,V>等,未完待续