09_面向对象高级_泛型

泛型

1. 认识泛型

定义类、接口、方法时,同时声明了一个或多个类型变量(如:),称为泛型类、泛型接口、泛型方法、它们统称为泛型。

2. 泛型类
public class Test {public static void main(String[] args) {MyArrayList<String> list = new MyArrayList<>();System.out.println(list.add("Jack"));  // trueSystem.out.println(list.get(0));  // Jack}
}// 自定义一个泛型类,去模拟 ArrayList
class MyArrayList<E> {  // 如果不想规范地写,其实E也可以写成其他字母private Object[] arr = new Object[10];  // 容器,用来装东西private int size;  // 记录当前装了多少个public boolean add(E content) {arr[size++] = content;return true;}public E get(int index) {return (E) arr[index];}
}
public class Test {public static void main(String[] args) {MyClass<String, String> obj = new MyClass<>();obj.put("只能是String类型", "只能是String类型");
//      Others<String> obj1 = new Others<>();  // 报错Others<MyClass> obj2 = new Others<>();  // 正常System.out.println(obj2.age);  // 输出结果:0}
}class MyClass<E, T> {public void put(E e, T t) {}
}// 要求 E 的类型是继承 MyClass 或者 E 的类型是 MyClass
class Others<E extends MyClass> {public int age;
}
3. 泛型接口
  • 注意:类型变量建议用大写的英文字母,常用的有:E、T、K、V 等
import java.util.ArrayList;public class Test {public static void main(String[] args) {}
}class Student {}class Teacher {}// 泛型接口
interface Data<E> {void add(E obj);ArrayList<E> getByName(String name);}// 实现类
class StudentData implements Data<Student> {@Overridepublic void add(Student obj) {}@Overridepublic ArrayList<Student> getByName(String name) {return null;}
}// 实现类
class TeacherData implements Data<Teacher> {@Overridepublic void add(Teacher obj) {}@Overridepublic ArrayList<Teacher> getByName(String name) {return null;}
}
4. 泛型方法

案例一

public class Test {public static void main(String[] args) {System.out.println(get(10));  // 10System.out.println(get("Java"));  // JavaSystem.out.println(get(new A()));  // 对象的内存地址: login.A@3b07d329}// 泛型方法public static <T> T get(T name) {return (T) name;}// 泛型方法public static <E> void run(E index) {}
}class A {}

案例二

通配符:就是" ? ",可以在"使用泛型"的时候代表一切类型;E T K V 是在定义泛型的时候使用

import java.util.ArrayList;public class Test {public static void main(String[] args) {// 需求:实现所有的汽车都能一起参加比赛ArrayList<Car> cars = new ArrayList<>();cars.add(new BMW());cars.add(new BENZ());go(cars);ArrayList<BMW> bmws = new ArrayList<>();bmws.add(new BMW());bmws.add(new BMW());go(bmws);ArrayList<BENZ> benzs = new ArrayList<>();benzs.add(new BENZ());benzs.add(new BENZ());go(benzs);ArrayList<Dog> dogs = new ArrayList<>();dogs.add(new Dog());dogs.add(new Dog());
//      go(dogs);  // 报错}// <T>是没有限制数据类型的泛型,如果我们加一个限制条件,不要让狗类进来,可以这样写:<T extends Cars>,完整代码如下一行所示public static <T extends Car> void go(ArrayList<T> allCars) {}// 知识扩展:// ? 是通配符,在使用泛型的时候可以代表一切类型" ? extends Car "【上限】  " ? super Car "【下限】
//    public static void go1(ArrayList<? extends Car> allCars) {}
//    public static void go2(ArrayList<? super Car> allCars) {}
}class Car {}class BMW extends Car {}class BENZ extends Car {}class Dog {}
5. 注意事项
  • 泛型是工作在编译阶段的,一旦程序编译成 class 文件,class 文件中就不存在泛型了,这就是泛型擦除。
  • 泛型不支持基本数据类型,只能支持对象类型(引用数据类型)
import java.util.ArrayList;public class Test {public static void main(String[] args) {
//      ArrayList<int> list1 = new ArrayList<>();  // 报错ArrayList<Integer> list2 = new ArrayList<>();  // 正常}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/161574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络之物理层(数据通信有关)

一、概述 1.1物理层引入的目的 屏蔽掉传输介质的多样性&#xff0c;导致数据传输方式的不同&#xff1b;物理层的引入使得高层看到的数据都是统一的0,1构成的比特流 1.2.物理层如何实现屏蔽 物理层靠定义的不同的通信协议&#xff08;一般称通信规程&#xff09; 这些协议…

基于高质量训练数据,GPT-4 Turbo更出色更强大

11月7日消息&#xff0c;OpenAI在首届开发者大会上正式推出了GPT-4 Turbo。 与GPT-4相比&#xff0c;GPT-4 Turbo主要有6方面的提升&#xff1a; 1、扩展下文对话长度&#xff1a;GPT4最大只能支持8k的上下文长度&#xff08;约等于6000个单词&#xff09;&#xff0c;而GPT-4…

智能小车速通版——手把手教程

考虑到大部分学校&#xff0c;会发放简易小车来作为智能车初期培训和筛选的工具&#xff0c; 于是&#xff0c;我写一个简单的教程&#xff0c;能够实现简单小车的电磁循迹。 通过这个教程&#xff0c;能够通过简化的步骤搭建寻迹小车&#xff0c;进而了解整个智能车是如何实…

Redis-Redis持久化,主从哨兵架构详解

Redis持久化 RDB快照&#xff08;snapshot&#xff09; 在默认情况下&#xff0c; Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置&#xff0c; 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时&#xff0c; 自动保存一次数…

【操作系统】I/O软件层次结构

文章目录 1. 前言2. I/O软件层次结构2.1 用户层软件2.2 设备独立性软件2.3 设备驱动程序2.4 中断处理程序 1. 前言 偶然看到“程序员的护城河是什么”这个话题&#xff0c;作为一个工作两年多的程序员吧&#xff0c;经常看到网上关于各种35岁危机、裁员甚至猝死之云云。最近也…

modbus协议及modbus TCP协议

一、Modbus协议 1.起源 Modbus由Modicon公司于1979年开发&#xff0c;是一种工业现场总线协议标准。 Modbus通信协议具有多个变种&#xff0c;其中有支持串口&#xff0c;以太网多个版本&#xff0c;其中最著名的是Modbus RTU&#xff08;通信效率最高&#xff0c;基于串口&am…

springboot前后端分离项目配置https接口(ssl证书)

文章目录 说明vue.js前端部署vue.js项目axios请求配置本地创建日志文件创建Dockerfile文件配置ssl证书nginx.confvue项目打包上传创建容器部署 后端springboot项目部署配置ssl证书打包部署 补充&#xff1a;jsk证书和pfx证书补充&#xff1a;两种证书的转化JKS转PFXPFX 转 JKS …

Elasticsearch:将最大内积引入 Lucene

作者&#xff1a;Benjamin Trent 目前&#xff0c;Lucene 限制 dot_product (点积) 只能在标准化向量上使用。 归一化迫使所有向量幅度等于一。 虽然在许多情况下这是可以接受的&#xff0c;但它可能会导致某些数据集的相关性问题。 一个典型的例子是 Cohere 构建的嵌入&#x…

使用 Lhotse 高效管理音频数据集

Lhotse 是一个旨在使语音和音频数据准备更具灵活性和可访问性的 Python 库&#xff0c;它与 k2 一起&#xff0c;构成了下一代 Kaldi 语音处理库的一部分。 主要目标&#xff1a; 1. 以 Python 为中心的设计吸引更广泛的社区参与语音处理任务。 2. 为有经验的 Kaldi 用户提供…

SpringBoot——启动类的原理

优质博文&#xff1a;IT-BLOG-CN SpringBoot启动类上使用SpringBootApplication注解&#xff0c;该注解是一个组合注解&#xff0c;包含多个其它注解。和类定义SpringApplication.run要揭开SpringBoot的神秘面纱&#xff0c;我们要从这两位开始就可以了。 SpringBootApplicati…

Spring实例化对象

默认proxyBeanMethods true&#xff0c;这种方法是用的代理模式创建对象&#xff0c;每次创建都是同一个对象&#xff0c;如果改为false每次都是不同的对象 FactoryBean的使用 定义的类A&#xff0c;造出来一个类B&#xff0c;可以在创造bean之前做一些自己的个性化操作

MFS分布式文件系统

目录 集群部署 Master Servers ​Chunkservers ​编辑Clients Storage Classes LABEL mfs高可用 pacemaker高可用 ​编辑ISCSI 添加集群资源 主机 ip 角色 server1 192.168.81.11 Master Servers server2 192.168.81.12 Chunkservers server3 192.168.81.13 Chunkserver…

【产品安全平台】上海道宁与Cybellum将整个产品安全工作流程整合到一个专用平台中,保持构建的互联产品的网络安全和网络合规性

Cybellum将 整个产品安全工作流程 整合到一个专用平台中 使设备制造商能够 保持他们构建的互联产品的 网络安全和网络合规性 产品安全性对 每个人来说都不一样 每个行业的系统、工作流程和 法规都存在根本差异 因此&#xff0c;Cybellum量身定制了 Cybellum的平台和技…

为何内存不够用?微服务改造启动多个Spring Boot的陷阱与解决方案

在生产环境中我们会遇到一些问题&#xff0c;此文主要记录并复盘一下当时项目中的实际问题及解决过程。 背景简述 最初系统上线后都比较正常风平浪静的。在系统运行了一段时间后&#xff0c;业务量上升后&#xff0c;生产上发现java应用内存占用过高&#xff0c;服务器总共64…

打印出一个底部有n个*的漏斗c语言

题目描述 打印出一个底部有n个*的漏斗 输入 第一行输入一个T;表示有T组测试数据 下面每一行都有一个n表示漏斗底部*的个数 n保证是奇数 输出 输出打印结果 两个测试答案之间要用换行分割 /*printf("这是第%d行 我要打印%d个* \n",Num,i); */ *********** *…

爱创科技总裁谢朝晖荣获“推动医药健康产业高质量发展人物”

中国医药市场规模已经成为全球第二大医药市场&#xff0c;仅次于美国。近年来&#xff0c;随着中国经济的持续增长和人民生活水平的提高&#xff0c;医药市场需求不断扩大。政府对医疗卫生事业的投入也在不断加大&#xff0c;为医药行业的发展创造了良好的政策环境。为推动医药…

SparkSession介绍

一、 介绍 SparkSession是Spark 2.0中引入的新概念&#xff0c;它是Spark SQL、DataFrame和Dataset API的入口点&#xff0c;是Spark编程的统一API&#xff0c;也可看作是读取数据的统一入口&#xff1b;它将以前的SparkContext、SQLContext和HiveContext组合在一起&#xff0…

结构体与指针_sizeof_static_extern_函数指针数组_函数指针_回调函数

一、结构体与指针 #include <stdint.h> #include <stdlib.h> #include <stdio.h> #define up_to_down(uuu) (downdemo_t *)(uuu->beg) #define __plc__ typedef struct updemo_s{uint8_t *head;uint8_t *beg;uint8_t *end; }updemo_t; typedef struct do…

陪玩圈子系统APP小程序H5,详细介绍,源码交付,支持二开!

陪玩圈子系统&#xff0c;页面展示&#xff0c;源码交付&#xff0c;支持二开&#xff01; 陪玩后端下载地址&#xff1a;电竞开黑陪玩系统小程序&#xff0c;APP&#xff0c;H5: 本系统是集齐开黑&#xff0c;陪玩&#xff0c;陪聊于一体的专业APP&#xff0c;小程序&#xff…

2:kotlin集合(Collections)

集合有助于数据分组&#xff0c;方便后续操作 集合类型说明Lists有序的可重复的集合Sets无序的不可重复的集合Maps键值对映射集合&#xff0c;键唯一&#xff0c;且一个键只能映射到一个值 每个集合类型都可以是可变的或者只读的 List List按照添加的顺序存储内容&#xff…