美文网首页
泛型程序设计

泛型程序设计

作者: LeoFranz | 来源:发表于2019-07-27 17:29 被阅读0次

一种将类型明确工作延后到生成对象或调用方法时的机制——把类型也当做参数。这种机制设计的初衷是为了规避杂乱地使用Object变量,产生的强转异常。

ArrayList的add方法即是一个典型案例:

public boolean add(E var1) {
        this.ensureCapacityInternal(this.size + 1);
        this.elementData[this.size++] = var1;
        return true;
    }

这种情况下,只需要创建ArrayList时候声明泛型类型,该方法就能被指定参数类型;否则ArrayList需要如下多个重载方法:

public boolean add(String var1);
public boolean add(Boolean var1);
public boolean add(Integer var1);
...
基本使用方法

ArrayList<String> arrayList = new ArrayList<>();
泛型声明如果不明确使用,则默认为Object类型
JDK7开始后面的类型声明可以省略.泛型声明类型只能被引用数据类型填充

  • 在类上声明泛型
    类中使用到E类型的地方会被限定类型
    public interface Collection<E> extends Iterable<E> {}
  • 在方法中声明泛型
    可以和类中声明的泛型不一致,方法调用时候,传入什么类型就当做什么类型处理
public class EObj<T> {
        public <E> void show(E e){
            System.out.println(e);
        }
    }
public static void main(String[] args) {
        TestClass testClass = new TestClass();
        TestClass.EObj eObj = testClass.new EObj<String>();
        eObj.show("pdddd");
        eObj.show(14);
        eObj.show(true);
//这里还涉及到自动装箱和拆箱的机制
    }
  • 在接口中声明泛型
public interface FanAdapter<E> {
    void show(E e);
}
//实现方案一,将类型提前声明
private class FanAdapterImp implements FanAdapter<String>{
        @Override
        public void show(String s) {

        }
    }
//实现方案二,将泛型带到子类中
//集合框架常用该设计
private class FanAdapterImp<E> implements FanAdapter<E>{
        @Override
        public void show(E e) {
            
        }
    }
高级用法
  • 通配符<?>,匹配任意类型
//指定的泛型中前后类型必须一致
        Collection<String> collection = new ArrayList<String>();//correct
        Collection<String> collection1 = new ArrayList<Object>();//wrong
        ArrayList<String> arrayList = new ArrayList<Object>();//wrong
        //?通配符下的泛型类型可以引用任何类型
        Collection<?> collection3 = new ArrayList<Boolean>();
        Collection<?> collection4 = new ArrayList<Integer>();
        ArrayList<?> collection2 = new ArrayList<String>();
  • <? extends E> 向下限定
        ArrayList<? extends Animal> arrayList = new ArrayList<Animal>();
        ArrayList<? extends Animal> arrayList1 = new ArrayList<Cat>();
        ArrayList<? extends Animal> arrayList2 = new ArrayList<Dog>();
        ArrayList<? extends Animal> arrayList3 = new ArrayList<String>();//wrong
  • <* super E> 向上限定
        ArrayList<? super Animal> arrayList1 = new ArrayList<Object>();
        ArrayList<? super Animal> arrayList2 = new ArrayList<Animal>();
        ArrayList<? super Animal> arrayList3 = new ArrayList<Cat>();//wrong

优势:

  • 避免了强制类型转换(声明了类型后就遍历集合时就无需强转)
    泛型机制修饰的代码,然后

相关文章

  • Java泛型与Kotlin泛型

    正文 本文主要列举Java泛型与Kotlin泛型的基本知识,以及两者的区别。 什么泛型 泛型程序设计是程序设计的一...

  • 泛型程序设计

    泛型程序设计 为什么要使用泛型程序设计 类型参数使程序具有更好的可读性和安全性 定义简单泛型类 泛型方法 类型变量...

  • 前端深入理解Typescript泛型概念

    首先介绍一下泛型的概念 泛型程序设计(generic programming)是程序设计语言的一种风格或范式。泛型...

  • Rust中的泛型

    [TOC] Rust中的泛型 泛型程序设计是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写...

  • C++模板

    C++模板和泛型程序设计 泛型程序设计(generic programming)是一种算法在实现时不指定具体要操作...

  • kotlin-----理解kotlin中的泛型和注解

    一、泛型 泛型是什么? 泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,...

  • Java学习总结之泛型程序设计

    泛型程序设计 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用。例如ArrayList类可以聚集任何类型...

  • 第8章 泛型程序设计

    第8章 泛型程序设计 使用泛型要比直接使用Object,让后进行强制类型转换要安全 8.1 为什么要使用泛型程序设...

  • JAVA泛型程序设计的意义

    为什么要使用泛型程序设计 泛型程序设计意味着编写的代码可以被不同类型的对象所重用。 参数类型的好处 在Java增加...

  • 泛型程序设计

    诚心推荐这一篇文章更好 java 泛型详解 泛型程序设计 泛型意味着编写的代码可以被不同类型重用 ArrayLis...

网友评论

      本文标题:泛型程序设计

      本文链接:https://www.haomeiwen.com/subject/lrmkcctx.html