前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符

Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符

作者头像
冷环渊
发布于 2021-11-29 02:06:27
发布于 2021-11-29 02:06:27
3.8K00
代码可运行
举报
运行总次数:0
代码可运行

泛型

什么是泛型:

泛型就相当于标签

形式:<>

jdk1.5之后,用泛型来解决元素类型不确定的数据保存操作,

例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。

没有泛型的集合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public static void main(String[] args) {
        ArrayList al = new ArrayList();
        al.add(98);
        al.add(18);
        al.add(38);
        al.add(88);
        al.add("丽丽");
        for (Object o : al) {
            System.out.print(o+" ");
        }
    }

如果不使用泛型的话,有缺点:

一般我们在使用的时候基本上往集合里随意放值,因为底层是一个obj类型的数组,所以什么都能放,不方便管理。

在jdk1.5以后开始,使用泛型加入泛型的优点:在编译的时候就会对类型进行检查,不是泛型的就无法添加到这个集合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public static void main(String[] args) {
        ArrayList<Integer> al = new ArrayList();
        al.add(98);
        al.add(18);
        al.add(38);
        al.add(88);
        for (Integer o : al) {
            System.out.print(o+" ");
        }
    }

总结:

  1. JDK1.5之后
  2. 泛型实际就是一个<>引起来的参数类型,这个参数类型具体在使用的时候才会确定类型
  1. 使用了泛型后,可以确定集合的类型,在编译的时候就可以检查出来
  2. 使用泛型可能觉得麻烦,实际上使用泛型才会简单,后续的便利操作会简单许多
  3. 泛型对应的类型都是引用类型不能是基本类型

泛型类和泛型接口

声明泛型类时传入类型实参 创建泛型类对象时,传入类型实参 类型实参为空时,默认为Object类型

继承泛型类:

1.泛型父类不传入类型实参,默认为Object类型 2.泛型父类传入类型实参,子类既可以是泛型类,也可以不是 3.泛型父类传入类型实参,则子类必须是泛型类,且子类的类型形参列表必须包含父类的类型形参列表

泛型类的定义和实例化,如果实例化的时候不明确指定泛型,那么默认为Object类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package TestGeneric.GenericTest;


public class test01<e> {
/*
* 这是一个普通类
* test01就是一个泛型类
* <>里面就是一个参数类型,但是这个类型是什么?,不确定,相当于一个占位
* 但是现在确定的是这个类型一定是引用类型,而不是基本类型
* */
int age;
String name;
e sex;
public void a(e n){

}
public void b(e[] n){

}
static class Test{
    public static void main(String[] args) {
    test01 gt1 = new test01();
    gt1.a("abc");
    gt1.a(17);
    gt1.a(9.8);
    gt1.b(new String[]{"a","b","A"});

        test01<String> gt2 = new test01<>();
        gt2.sex ="男";
        gt2.a("abc");
        gt2.b(new String[]{"a","b","A"});
    }

}
}
继承:父类指定泛型接口

当父类指定了泛型类型,子类就不许要再指定了,可以直接使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static class SubGeneric extends test01<Integer>{

}

static class Demo{
    public static void main(String[] args) {
            SubGeneric sgt = new SubGeneric();
                sgt.a(19);
    }
}
继承:父类不指定

如果父类不指定泛型,那么子类在实例化的时候需要指定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    static class SubGeneric2<e> extends test01<e>{
            
    }

泛型类可以定义多个参数类型

泛型类的构造器写法:

不同泛型的引用类型不可以互相赋值

泛型如果不指定,就会被擦除,例子就是

泛型类中的静态方法不能使用类的泛型

不能直接使用泛型数组的创建,如果非要创建

泛型方法

  1. 什么是泛型方法,不是带泛型的方法就是泛型方法,泛型方法有要求:这个方法的泛型参数类型要和当前类的泛型方法的泛型无关
  2. 换个角度:泛型方法对应的那个泛型参数类型和当前所在的这个类,是否为泛型类,泛型是啥,无关
  3. 泛型方法定义的时候,前面要加上t,原因如果不加的话,会把t当作一种数据类型,然而代码中没有t类型那么就会报错
  4. t的类型实在调用方法的时候确定的
  5. 泛型方法是否是静态方法?可以是

代码类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class test02<e> {
    public  void a(e e){

    }
    public static <T>  void b(T t){

    }

static class Demo{
    public static void main(String[] args) {
        test02<String> t2 = new test02();
        t2.a("1");
        t2.b("abc");
    }
}

泛型参数存在继承的情况

前面两个引用类型,都可以赋值,为什么list不行?

其实我们用的Arraylist,他的底层是一个Obj类型的数组,我们的泛型负责在编译的时候限制类型,

例子:两个类,a,b两类,a是b的父类,两者是继承关系,但是 G ,G两者不存在继承关系,应为他们都是引用Arraylist所以是同级关系

通配符

当我想要重载不同泛型的list时,常见的重载无法让我们完成需求,于是我们需要通配符

在没有通配符的情况下,下面a方法,相当于重复定义

通配符是什么?

发现:两个类,a,b两类,a是b的父类,两者是继承关系,但是 G< a> ,G< b>两者不存在继承关系,应为他们都是引用Arraylist所以是同级关系但是使用了通配符后,我们发现G变成了G< a> ,G< b>的父类

使用通配符

无边界通配符( ?),固定上边界通配符(?extends 上界类),固定下边界通配符(?super 下界类)

学习主要就是为了方便查看API文档

使用小细节

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public  void  a(List<?> list){
//    遍历
    for (Object o : list) {
        System.out.println(o);
    }

//    数据的写入操作
//    list.add("abc");--》出错,不能随意的写入

//    读取操作
    Object s  = list.get(0);
}

泛型受限

并列关系,我们如何限制类型,

  • 用extends的是本类和类所有的子类:定义上限
  • 用super是本类和本类的父类,定义下限
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        List<Object> a = new ArrayList<>();
        List<Person> b = new ArrayList<>();
        List<Student> c = new ArrayList<>();

A,B,C三个泛型的类型不相同,Person是Student的父类

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/11/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Angularjs基础(十二)
ng-model-options       描述:规定如何更新模型             实例: 在失去焦点时绑定输入框的值scope 变量中。                 <div ng-app="myApp" ng-controller="myCtrl">                   <input ng-model ="name">                 </div>                 <script>          
用户1197315
2018/01/22
3.3K0
AngularJS系列(八)——事件
ng-click :点击 ng-click 指令定义了 AngularJS 点击事件。 <div ng-app="myApp"ng-controller="myCtrl"> <buttonng-click="count=count+1">点我!</button> <p>{{count}}</p> </div> <script> var app = angular.module('myApp', []); app.controller('myCtrl', function
逝兮诚
2019/10/30
5350
Angularjs基础(六)
AngularJS HTML DOM     AngularJS为HTML DOM 元素的属性提供了绑定应用数据的指令。 ng-disabled指令     ng-disabled指令直接绑定应用数据到HTML的disabled属性。       实例:       <div ng-app="" ng-init="mySwitch=true">         <p>           <button ng-disableled="mySwitch">点我!</button
用户1197315
2018/01/19
3.2K0
AngularJS系列(七)——HTML DOM操作
ng-disabled 指令绑定应用程序数据"mySwitch" 到 HTML 的 disabled 属性。
逝兮诚
2019/10/30
5580
angularJS学习之路(六)---指令
一个东西需要说明:根据HTML标准,布尔属性代表一个true或者false值,当这个属性出现的时候,这个属性的值就是true, 无论实际值是什么,如果未出现,这个属性的值就是false
wust小吴
2019/07/08
1.8K0
AngularJS HTML DOM
ng-disabled 指令直接绑定应用程序数据到 HTML 的 disabled 属性。
陈不成i
2021/07/23
8600
AngularJS 简介
AngularJS 是一个 JavaScript 框架。它可通过 <script> 标签添加到 HTML 页面。
陈不成i
2021/07/23
1.2K0
【一起来烧脑】一步学会AngularJS系统
AngularJS是一个JavaScript框架 一个用JavaScript编写的库
达达前端
2019/07/18
5.8K0
【一起来烧脑】一步学会AngularJS系统
Angularjs基础(八)
AngularJS Bootstrap     AngularJS 的首选样式表是 Twitter Bootstrap ,Twitter Bootstrap 是目前最受欢迎的前端框架 Bootstrap     你可以在你的 AngularJS 应用中加入 Twitter Bootstrap,你可以在你的 <head>元素中添加如下代码:     <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/boo
用户1197315
2018/01/19
3.2K0
AngularJS 事件
ng-hide 指令设置 <p>元素及两个输入域是否可见, 根据 myVar 的值 (true 或 false) 来设置是否可见。
陈不成i
2021/07/23
1.8K0
angularjs学习第七天笔记(系统指令学习)
  您好,接着在昨天对简单指令学习了解以后,今天开始学习了解angularjs中的系统指令
小小许
2018/08/30
3K0
angularjs学习第七天笔记(系统指令学习)
AngularJS指令「建议收藏」
AngularJS 通过被称为 指令 的新属性来扩展 HTML。 AngularJS 通过内置的指令来为应用添加功能。 AngularJS 允许你自定义指令。
全栈程序员站长
2022/09/15
1.2K0
Angularjs基础(九)
AngularJS 应用 应用程序讲解     实例:         <html ng-app="myNoteApp">           <head>             <meat charset="utf-8">             <script src="http://apps.bdimg.com/libs/angular.js/1.4.6angular.min.js"></script>           </head>           <body>
用户1197315
2018/01/22
1.3K0
走进AngularJs(二) ng模板中常用指令的使用方式
  通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的。ng的模板真是让我爱不释手。学习ng道路还很漫长,从模板开始入手是个不错方式,因为这部分内容相对简单好理解,而且是视图层的东西,大家都喜欢可以立马看得见的东西嘛。本篇我将搜罗模板中的常用指令一一测试,了解其使用方法,有点像背单词的感觉,会比较枯燥。不过对于初学,这样的枯燥是必须要经历的,开始~
用户3055976
2018/09/12
3.1K0
【笔记】AngularJs学习笔记[02]【实践回顾与知识点归纳】
上一篇中,我们介绍ng的数据绑定的方法,不知道你是否能给吸收。想了一下,为了在 ng 入门之前能够帮助大家打好基础,所以在这篇中我就用一个例子来解析 ng,并归纳一下 ng 的知识点。
前端修罗场
2023/10/07
3450
【笔记】AngularJs学习笔记[02]【实践回顾与知识点归纳】
Angularjs基础(二)
AngularJS 表达式   AngularJS 表达式写在双大括号内:{{expression}}   AngularJS 表达式把数据绑定到HTML,这与ng-bind 指令有异曲同工之妙   AngularJS 将在表达式书写的位置输出数据。   AngularJS 表达式很像JavaScript表达式:他们可以包含文字,运算符和变量。     实例{{5+5}} 或者{{firstName + "" +lastName}} AngularJs 数字   AngularJS 数字就像J
用户1197315
2018/01/19
3.7K0
【AngularJS】 # AngularJS入门
ng-app 指令定义一个 AngularJS 应用程序。 若不声明,将直接显示表达式。
全栈程序员站长
2022/09/15
24.1K0
【AngularJS】 # AngularJS入门
AngularJS Bootstrap
AngularJS 的首选样式表是 Twitter Bootstrap, Twitter Bootstrap 是目前最受欢迎的前端框架。
陈不成i
2021/07/26
4.8K0
AngularJS系列之常用指令
这节给大家介绍一下AngularJS中一些常用的指令,例如:ng-app、ng-init、ng-repeat、ng-model等等之类的指令。 那什么是AngularJS的指令呢,其实就是相当于HTM
林老师带你学编程
2018/01/03
2.2K0
7-进军 angular1.x 表单和事件、模块
通常 AngularJS 应用程序将模块和控制器包含在 JavaScript 文件中。
西南_张家辉
2021/02/02
2.5K0
相关推荐
Angularjs基础(十二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验