IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JAVA泛型的定义理解以及类型形参的上限 -> 正文阅读

[Java知识库]JAVA泛型的定义理解以及类型形参的上限

一、引子

List list = new ArrayList();
list.add(1);
list.add(2);
list.add("String");
System.out.println(list);
List <String> lt1 = new ArrayList<>();
List <Integer> lt2 = new ArrayList<>();
复制代码

image.png


观察这样一段代码,我们会发现当使用Arraylist实现List接口的时候,我们并没有定义数据类型,list同时能够存Integer和String类型的数据。并且在我们定义了lt1和lt2的时候分别指明了Integer和String数据类型,同样也是可行的。那么我们就会发现List接口在定义的时候应该并不是指定了一个确定的数据类型,在查看源码的时候我们就能够发现List接口定义了泛型<T>,这时候我们回忆起在使用HashMap的时候同样也是需要根据需要定义数据类型,再去查阅HashMap源码,果不其然:

image.png


那么这个时候我们多少也能够理解泛型的作用了,下面来看泛型定义:因为集合存放的数据类型不固定,故往集合里面存放元素时,存在安全隐患?如果在定义集合时,可以想定义数组一样指定数据类型,那么就可以解决该类安全问题。JDK1.5后出现了泛型,用于解决集合框架的安全问题。泛型是一个类型安全机制。

二、如何自己来写一个自定义泛型类(接口)?

class Foo <T> {
    private T data;
    public Foo(T data) {
        this.data = data;
    }
    public T getData() {
        return data;
    }
}
复制代码

简单实现:

image.png


需要注意的是:
1.允许在定义接口、类、方法时声明类型形参,该类型形参可以在整个接口、类、方法中当成普通类型使用;
2.类型形参将在声明变量、创建对象、调用方法时动态地指定,即传入实际的类型参数(可称作类型实参)。
在实例化的时候,如果不声明数据类型,那么默认是Object类型。

三、泛型类的子类(接口)

在定义泛型类的子类的时候我们肯定需要extends关键字,那么这时候我们需要写Foo<T>还是Foo<String>这样的形式呢?
1.为泛型类定义子类时,不能在父类上包含类型形参,但可以包含类型实参。
2.因为这种情况下,不是在定义父类,而是在使用父类,使用时需传入实参。
因为我们在这样的场景下我们子类extends父类,在使用父类的时候我们需要传的是实参,而不是形参,在定义的时候我们定义形参,但是在使用的时候我们需要传入的是实参。

四、泛型定义类型形参的上限

我们在定义的时候,如果限定的数据类型不是Object,而是数字,那么这时候就可以定义类型形参的上限定义为Number:class Foo<T extends Number> {}。
那么这时候细心的小伙伴就会发现,那我为什么不在定义泛型类的时候就把泛型换成Number呢?那么我们看下面的代码
定义Firse类,直接指定Number作为形参:

class First <Number> {
    private Number data;
    public First(Number data) {
        this.data = data;
    }
    public Number getData() {
        return data;
    }
}
复制代码

调用:

image.png


???first1理所应当没有问题,但是first2为什么也没有问题呢?
这时候我们我鼠标放到泛型类的Number上会发现一些端倪:

image.png

我们再看看一般的Number对象:

image.png


正常的Number是在lang包下的,而First类里面的形参,只不过是叫做Number的泛型而已。(恍然大悟)
最后就是测试正常定义泛型的上限:

class Second <T extends Number> {
    private T data;
    public Second(T data) {
        this.data = data;
    }
    public T getData() {
        return data;
    }
}
复制代码

果不其然,编译都通不过

image.png

希望对学习Java的你有所帮助!

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-16 17:32:20  更:2021-12-16 17:33:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:19:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码