java基础进阶-泛型1

泛型的定义

指参数化类型,单从字面上的定义我们觉得时一脸疑惑,但是我们在学习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>等,未完待续

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值