Java中的泛型

devtools/2024/11/14 21:36:16/

什么是泛型?

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

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

案例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/devtools/134000.html

相关文章

LLMs之VDB:Elasticsearch的简介、安装和使用方法、案例应用之详细攻略

LLMs之VDB&#xff1a;Elasticsearch的简介、安装和使用方法、案例应用之详细攻略 目录 Elasticsearch的简介 1、特点 Elasticsearch的安装和使用方法 1、安装 T1、云服务—使用 Elastic Cloud T2、本地安装、运行和管理Elasticsearch(仅限开发和测试) 用start-local脚本…

如何制作代购系统的 物流管理模块

在代购系统中&#xff0c;物流管理模块是至关重要的组成部分&#xff0c;它涉及到商品配送的各个环节&#xff0c;确保商品能够高效、准确地送达消费者手中。本文将详细介绍如何制作一个代购系统的物流管理模块&#xff0c;包括后端服务设计和前端界面实现&#xff0c;以及如何…

【eNSP】企业网络架构实验——vlan间的路由通信(三)

VLAN间的路由是指不同VLAN之间的通信&#xff0c;通常VLAN是用来分割网络流量和提高网络安全性的。 一、VLAN 1. 什么是VLAN&#xff1f; VLAN&#xff0c;全称是虚拟局域网&#xff08;Virtual Local Area Network&#xff09;&#xff0c;是一种将物理局域网&#xff08;LA…

SpringBoot赋能的共享汽车业务管理系统

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

【日常记录-Java】代码配置Logback

1. 简介 在Logback中&#xff0c;推荐使用配置文件&#xff08;如logback.xml或logback-spring.xml&#xff09;来设置日志记录的行为。但在实际应用中&#xff0c;会有动态配置logback的需求。此时可通过编程的方式直接操作LoggerContext以及相关的Logger、Appender、Encoder等…

【bayes-Transformer-GRU多维时序预测】多变量输入模型。matlab代码,2023b及其以上

% 1. 数据准备 X_train 训练数据输入; Y_train 训练数据输出; X_test 测试数据输入; % 2. 模型构建 inputSize size(X_train, 2); numHiddenUnits 100; numResponses 1; layers [ … sequenceInputLayer(inputSize) biLSTMLayer(numHiddenUnits, ‘OutputMode’, ‘se…

Java开发人员从零学习ArkTs笔记(二)-函数与类

大家好&#xff0c;我是一名热爱Java开发的开发人员。目前&#xff0c;我正在学习ARKTS&#xff08;Advanced Java Knowledge and Technology Stack&#xff09;&#xff0c;并将不断输出我的学习笔记。我将在这里分享我学习ARKTS的过程和心得&#xff0c;希望能够为其他开发人…

使用 Visual Studio Installer 彻底卸载 Visual Studio方法与下载

使用 VisualStudioUninstaller 卸载 Visual Studio 的详细步骤&#xff08;以管理员权限运行&#xff09; 步骤 1&#xff1a;下载并解压 VisualStudioUninstaller 访问下载工具。 点击下载 解压下载的文件到本地目录&#xff0c;例如&#xff1a;C:\VSUninstaller。 步骤 …