Java中的泛型

server/2024/11/14 22:23:47/

什么是泛型?

限制容器存储的元素类型,用于集合、接口、实现类中

说明:泛型参数在指明时,不可以使用基本数据类型!不过可以使用包装类替换

案例1:ArrayList

java">ArrayList<Integer> list = new ArrayList<Integer>(); // 或省略后面的Integer ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
// list.add("bb"); // 报错
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()) {Integer i = iterator.next(); // 使用泛型,此处不再需要强转了System.out.println(i);
}

案例2:HashMap

java">HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("aaa", 12);
map.put("bbb", 13);
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
while(iterator.hasNext()) {Map.Entry<String, Integer> entry = iterator.next();System.out.println("key:" + entry.getKey() + "\tvalue:" + entry.getValue());
}

案例3:比较器:自然/定制排序

java">class Person implements Comparable<Person>{private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}// ... 此处省略name、age的getter、setter方法// ... 此处省略toString方法public int compareTo(Person p) {return this.age - p.getAge();  // 自然排序:按年龄从小到大排序}
}
class Test {public static void main(String[] args) {ArrayList<Person> list = new ArrayList<>();list.add(new Person("ccc", 19));list.add(new Person("aaa", 18));list.add(new Person("bbb", 19));Collections.sort(list); // 自然排序// 定制排序Collections.sort(list, new Comparator<Person>() {// 先比较年龄(从小到大),年龄一样时比较姓名(从小到大)public int compare(Person p1, Person p2) {int result = p1.getAge() - p2.getAge();if (result != 0) {return result;}return p1.getName().compareTo(p2.getName());}});System.out.println(list);}
}

自定义泛型

说明:
① 在定义类/接口时加上<T>,就表示此类/接口具备了泛型功能
② 类/接口中所有用到的泛型(T)的地方,都会替换成实例化时声明的类型
③ 当一个类继承泛型类时,泛型默认不会继承过来,所以此子类不是个泛型类(需要单独指明泛型),并且父类带泛型的属性默认是Object类型
④ 在静态方法中不能使用泛型,因为在创建对象时才能指明泛型类型
⑤ 异常类不能带泛型

java">class CustomTest<T> {private int id;private T a;public CustomTest() {}public CustomTest(int id, T a) {this.id = id;this.a = a;}public T getA() {return this.a;}public void setA(T a) {this.a = a;}
}
// 情况一:直接继承,子类是不带泛型的,且继承过来的父类泛型默认是Object
class SubCustomTest1 extends CustomTest {}
// 情况二:子类不是泛型类,继承父类时,指明父类泛型的类型是Integer,所以继承过来的属性是Integer
class SubCustomTest2 extends CustomTest<Integer> {}
// 情况三:子类是个泛型,并且指明父类泛型与子类泛型相同
class SubCustomTest3<T> extends CustomTest<T> {}
// 情况四:子类是个泛型,并且指明父类泛型是Integer
class SubCustomTest4<E> extends CustomTest<Integer> {}
// 情况五:指明父类泛型是T,子类泛型是E,不冲突
class SubCustomTest5<T, E> extends CustomTest<T> {}public class Test {public static void main(String[] args) {CustomTest<String> ct = new CustomTest<>();ct.setA("123");// ct.setA(6); // 类型不匹配,报错System.out.println(ct.getA()); // "123"}
}

自定义泛型方法

  1. 格式:public <E> E method(E str) {}
  2. 说明
    ① 在返回值类型前面加上<E>就表示这是有一个泛型方法
    ② 在泛型方法调用时,指明泛型类型
    ③ 泛型方法可以声明static的
    ④ 泛型方法跟泛型类无关

http://www.ppmy.cn/server/141957.html

相关文章

看懂本文,入门神经网络Neural Network

神经网络&#xff08;Neural Network&#xff09; 1.1图片 每一个图片都是三维数组&#xff0c;每个像素的值为0-255&#xff0c;如 训练集Training Dataset&#xff1a;“上课学的知识”&#xff0c;用于训练模型得到参数 验证集Validation Dataset&#xff1a;“课后习题”…

(蓝桥杯C/C++)——搜索

一、回溯法 1.回溯法简介 回溯法一般使用 ** DFS(深度优先搜索) ** 实现&#xff0c;DFS是一种遍历或搜索图、树或图像等数据结构的算法&#xff0c;当然这个图、树未必要存储下来(隐式处理就是回溯法)&#xff0c;常见的是通过某种关系构造出的搜索树&#xff0c;搜索树一般…

Linux git-bash配置

参考资料 命令提示符Windows下的Git Bash配置&#xff0c;提升你的终端操作体验WindowsTerminal添加git-bash 目录 一. git-bash配置1.1 解决中文乱码1.2 修改命令提示符 二. WindowsTerminal配置git-bash2.1 添加git-bash到WindowsTerminal2.2 解决删除时窗口闪烁问题 三. VS…

音视频入门基础:MPEG2-TS专题(3)——TS Header简介

注&#xff1a;本文有部分内容引用了维基百科&#xff1a;https://zh.wikipedia.org/wiki/MPEG2-TS 一、引言 本文对MPEG2-TS格式的TS Header进行简介。 进行简介之前&#xff0c;请各位先下载MPEG2-TS的官方文档。ITU-T和ISO/IEC都分别提供MPEG2-TS的官方文档。但是ITU提供的…

【JAVA】正则表达式中的中括弧

在Java的正则表达式中&#xff0c;[] 是用来定义一个字符集&#xff08;character class&#xff09;的。使用字符集可以匹配括号内的任何一个单个字符。下面是关于 [] 的一些基本用法和例子&#xff1a; 匹配特定字符&#xff1a; [abc] 匹配 ‘a’ 或 ‘b’ 或 ‘c’。 范围…

群控系统服务端开发模式-应用开发-前端退出功能

我们从未登录一直到退出&#xff0c;现在已经登录到操作&#xff0c;现在完成退出。退出有两种情况下会退出&#xff1a;第一种情况下是手动点击退出按钮&#xff0c;第二种情况下是登录过期时间到了自动退出的。 一、手动退出 因退出及个人信息页面都在公有页面&#xff0c;所…

树莓派安装FreeSWITCH

1、下载相关资源&#xff1a; # 假设所有资源都下载到/opt/目录下 cd /opt # 下载FreeSWITCH源码 git clone https://github.com/signalwire/freeswitch # 下载libks源码 git clone https://github.com/signalwire/libks # 下载sofia-sip源码 git clone https://github.com/fr…

鸿蒙next版开发:相机开发-适配不同折叠状态的摄像头变更(ArkTS)

在HarmonyOS 5.0中&#xff0c;ArkTS提供了强大的相机开发能力&#xff0c;其中包括适配不同折叠状态的摄像头变更。这对于开发折叠屏设备上的相机应用尤为重要&#xff0c;因为摄像头的位置和可用性可能会随着设备的折叠状态而变化。本文将详细介绍如何在ArkTS中适配不同折叠状…