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

    这样就可以了

  • 相关阅读:
    如何有效的遍历django的QuerySet
    python进程池剖析(三)
    python进程池剖析(二)
    python进程池剖析(一)
    条件变量signal与unlock的顺序
    智能指针与句柄类(四)
    解析正则 /(d)(?=(d{3})+.)/g
    原生JS实现增加删除class
    RN 热更新
    Windows下搭建IOS开发环境
  • 原文地址:https://www.cnblogs.com/macula7/p/1960488.html
Copyright © 2020-2023  润新知