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

    这样就可以了

  • 相关阅读:
    Delphi-基础(for循环)
    Delphi-基础(运算符)
    Delphi-基础
    python 序列化
    python 模块、包
    time,datetime,random,os,sys,hashlib,logging,configparser,re模块
    第一章.Python环境安装&Pycharm日常使用
    第一章.变量.常量.注释.运算符.if流程控制
    Redis持久化数据介绍&主从复制和哨兵模式环境部署
    Redis缓存应用安装部署&常见的数据类型
  • 原文地址:https://www.cnblogs.com/macula7/p/1960488.html
Copyright © 2011-2022 走看看