Java泛型复习笔记

Posted Putarmor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java泛型复习笔记相关的知识,希望对你有一定的参考价值。

在这里插入图片描述

1.泛型出现的意义:

在没有出现泛型之前,假如我们实现一个栈,栈中存放的数据类型只能有一种;当我们想去存放另外一种数据类型时,又要重新创建一个类,定义存放的数据类型;可以看出,这样操作是非常不方便的,同时代码也是非常冗余的,不够简洁。

我们猜想创建Object类型的栈是否可以弥补上述的缺点?Object类默认是所有类的父类,当栈中存放的数据类型为Object类型,任何类型的元素看起来都可以存放在栈中,似乎看起来很完美,但是在我们取得元素的时候,却需要做强制类型转换例如String str = (String)stack.get(i);每取一次都要做类型强转,非常的繁琐不方便。

因而泛型就出现了。泛型是什么呢?它是程序编译时期的一种机制,在使用对类进行限定后,我们所创建的类就是一个泛型类;此时栈中可以存放任意类型的元素,泛型在编译时期具有擦除机制,也就是将T类型擦除为Object类型,因此才可以存放各种引用类型的元素;但是当我们创建一个对象后只能指定存放一种类型的元素,泛型会根据我们设定的类型自动进行数据类型检查,当存放别的类型元素时,编译就会报错;此外当我们取出元素时候,不用再去做强制类型转换,泛型已经自动隐式做了类型转换。

2.Object代码示例:

创建一个Object类型的栈:

class Mystack{
    Object[] elem;
    int top;

    public Mystack() {
        this.elem = new Object[10];
    }

    public void push(Object val){
        this.elem[top] = val;
        top++;
    }

    public Object getTop(){
        return this.elem[top-1];
    }
}

这里是引用
可以看出,栈中可以存放各种引用类型的变量,代码编译不报错
在这里插入图片描述
调用getTop方法取栈顶元素时,代码完美出错,和我们上述认知一样;原因:getTop()返回的是Object类型,而栈顶放的是String类型。
在这里插入图片描述
在这里插入图片描述
此时可以发现,经过强制类型转换,没有出现代码编译错误;正常取得栈顶元素并打印出来。

3.泛型示例:
创建一个泛型栈:

//<T>标志该类是一个泛型类

class Mystack<T>{
    T[] elem;
    int top;

    public Mystack() {
        this.elem = (T[])(new Object[10]);
    }

    public void push(T val){
        this.elem[top] = val;
        top++;
    }

    public T getTop(){
        return this.elem[top-1];
    }
}

在这里插入图片描述
可以看出,指定存储数据类为Integer,当插入Double类型时,编译出错,这就是泛型自带的自动类型检查机制。
在这里插入图片描述
在这里插入图片描述
调用getTop方法获得栈顶元素时,编译不报错,泛型已经自动的进行了类型转换,正常获得栈顶元素并打印。
多来几个例子看看:
在这里插入图片描述

4.泛型特点:

以上就是本人对泛型的浅薄认知,现对泛型的特点进行一个总结:

  • 泛型是编译时期的一种机制,程序运行时期没有泛型机制。
  • 泛型可以自动进行类型检查;自动进行类型转换
  • 简单类型不能作为泛型的参数取使用,必须传入的是引用类型(包装类型可以)
  • 泛型编译原理:擦除机制。
    在编译时期将T类型擦除为Object类型,其意义是为了存放任意类型的数据
  • 不能new泛型类型的数组,需要new Object[ ]再使用T[ ]做强制类型转换
  • 泛型类上届:
    比如:class Algorithm<E extends Animal> E可以是Animal子类或者Animal本身

以上是关于Java泛型复习笔记的主要内容,如果未能解决你的问题,请参考以下文章

C# 复习笔记4

笔记-java泛型详解

Java泛型学习笔记 - 泛型的继承

操作 Java 泛型:泛型在继承方面体现与通配符使用

JAVA关于泛型的笔记

java复习过程中的知识点总结