当前位置: 首页 > news >正文

Java进阶学习笔记21——泛型概念、泛型类、泛型接口

泛型:

定义类、接口、方法的时候,同时声明了一个或者多个类型变量(如: <E>),称之为泛型类、泛型接口、泛型方法,我们统称之为泛型。

说明这是一个泛型类。

如果不使用泛型,我们可以往ArrayList中传入各种对象,get方法返回的是Object类对象。

package cn.ensource.d8_generics;import java.util.ArrayList;public class Test {public static void main(String[] args) {// 目标:认识泛型ArrayList list = new ArrayList();list.add("a");list.add(123);list.add("黑马");Cat a = new Cat();list.add(a);for (int i = 0; i < list.size(); i++) {String res = (String) list.get(i);   // 强转System.out.println(res);}}
}

强制类型转换会导致类型转换异常:

使用泛型类型为String类型,现在我给的是Cat对象,所以报错。 

package cn.ensource.d8_generics;import java.util.ArrayList;public class Test {public static void main(String[] args) {// 目标:认识泛型
//        ArrayList list = new ArrayList();
//        list.add("a");
//        list.add(123);
//        list.add("黑马");
//        Cat a = new Cat();
//        list.add(a);
//
//        for (int i = 0; i < list.size(); i++) {
//            String res = (String) list.get(i);   // 强转
//            System.out.println(res);
//        }System.out.println("-----------------------");ArrayList<String> list1 = new ArrayList<>();   // JDK1.7 开始,后面的数据类型可以不声明list1.add("Java1");list1.add("Java2");list1.add("Java3");list1.add("Java4");
//        list1.add(new Cat());for (int i = 0; i < list1.size(); i++) {String res = list1.get(i);System.out.println(res);}}
}

作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及其可能出现的异常。

泛型的本质:把具体的数据类型作为参数传给类型变量。

自定义泛型类:这就是C++的template

package cn.ensource.d9_generics_class;// 泛型类的定义
public class MyArrayList<E> {Object[] obj = new Object[10];private int size;public boolean add(E e) {arr[size++] = e;return true;}public E get(int index) {return (E) obj[index];}
}

多个类型变量:

package cn.ensource.d9_generics_class;public class MyArrayList2<E, T> {public void put(E e, T t) {}}

有继承约束关系的类型变量,后面只能定义Animal及其子类类型。

package cn.ensource.d9_generics_class;public class MyClass3<E extends  Animal> {}

泛型接口:

Student类:

package cn.ensource.d10_generics_interface;public class Student {
}

Teacher类:

package cn.ensource.d10_generics_interface;public class Student {
}

Data泛型接口:

package cn.ensource.d10_generics_interface;import java.util.ArrayList;public interface Data<T> {void add(T t);ArrayList<T> getByName(String name);}

TeacherData实现接口类:

package cn.ensource.d10_generics_interface;import java.util.ArrayList;public class TeacherData implements Data<Teacher> {@Overridepublic void add(Teacher teacher) {}@Overridepublic ArrayList<Teacher> getByName(String name) {return null;}
}

StudentData实现接口类:

package cn.ensource.d10_generics_interface;import java.util.ArrayList;public class StudentData implements Data<Student> {@Overridepublic void add(Student student) {}@Overridepublic ArrayList<Student> getByName(String name) {return null;}
}

测试类:

package cn.ensource.d10_generics_interface;public class Test {public static void main(String[] args) {// 目标:掌握泛型接口的定义和使用// 场景:我们的系统需要处理学生和老师的数据,保存对象数据,根据名称查询数据}
}

注意:

类型变量建议是大写的英文字母,常用的有E/T/K/V等。

相关文章:

  • 风景园林设计乙级资质被撤销后的恢复途径
  • 生意人【着眼于未来、公私分明、有决断又有人情味、立场、享受过程】
  • 部署LAMP平台
  • web刷题记录(1)
  • PADS做CAM文件时,提示填充宽度对于精确的焊盘填充过大
  • 剪映网页版
  • 面向可复用性和可维护性的设计模式 课程学习总结
  • 基于java实现图片中任意封闭区域识别
  • NSSCTF-Web题目4
  • Bentham Science药学全文期刊库文献在家轻松下载
  • Java开发-面试题-0001-String、StringBuilder、StringBuffer的区别
  • Gir clone 设置代理与错误
  • [每日一练]查询从不订购的客户(标量子查询)
  • 数据结构——二叉树的实现
  • opencv进阶 ——(七)图像处理之寸照换背景
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【个人向】《HTTP图解》阅后小结
  • cookie和session
  • Create React App 使用
  • ES6--对象的扩展
  • Git学习与使用心得(1)—— 初始化
  • Java读取Properties文件的六种方法
  • java中的hashCode
  • JSONP原理
  • Protobuf3语言指南
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • react 代码优化(一) ——事件处理
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 昨天1024程序员节,我故意写了个死循环~
  • ​Java并发新构件之Exchanger
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • (Git) gitignore基础使用
  • (NSDate) 时间 (time )比较
  • (接口自动化)Python3操作MySQL数据库
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (五)MySQL的备份及恢复
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转) Android中ViewStub组件使用
  • (转)h264中avc和flv数据的解析
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .NET下的多线程编程—1-线程机制概述
  • @Transactional事务注解内含乾坤?
  • @在php中起什么作用?
  • []sim300 GPRS数据收发程序
  • [AutoSar NVM] 存储架构
  • [C进阶] 数据在内存中的存储——浮点型篇
  • [FT]chatglm2微调
  • [iOS]如何删除工程里面用cocoapods导入的第三方库
  • [NOIP2014普及组]子矩阵