zoukankan      html  css  js  c++  java
  • 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);
    }

    这样就可以了

  • 相关阅读:
    深度神经网络的优化算法
    Python 正则表达式
    《java面试十八式》第一式 --冈本零点零一
    《java面试十八式》--引子
    Redis第二讲【Redis基本命令和五大数据结构】
    redis第一讲【redis的描述,linux和docker下的安装使用】
    springboot中的pom文件是如何管理依赖的
    详谈springboot启动类的@SpringBootApplication注解
    工具类中注入service和dao
    windows下安装ssdb
  • 原文地址:https://www.cnblogs.com/macula7/p/1960488.html
Copyright © 2011-2022 走看看