【JAVA基础篇】泛型详解版

  🔥作者主页:小林同学的学习笔录

🔥mysql专栏:小林同学的专栏

目录

1.泛型的认识

2.泛型类

3.泛型方法

4.泛型接口

5.特别强调

6.类型通配符


简单化知识点,让你彻底了解泛型

1.泛型的认识

Java泛型是一种在Java编程语言中用来创建泛型类、接口和方法的机制。泛型提供了在编译时期

进行类型检查和类型安全的方法,使得程序员可以在编写代码时指定类、接口或方法可以操作的数

据类型,而不必在实际使用时再指定类型。

使用泛型的好处包括:

  1. 类型安全:泛型可以在编译时检查类型,避免了在运行时出现类型转换错误。
  2. 代码重用:泛型可以使代码更加通用,可以用于多种类型的数据。
  3. 简化代码:泛型可以减少代码的重复量,提高代码的可读性和可维护性。
  4. Get获取数据不需要强转类型

java 中泛型标记符:

  • E - Element (在集合中使用,因为集合中存放的是元素)
  • T - Type(Java 类)
  • K - Key(键)
  • V - Value(值)
  • N - Number(数值类型)
  •  - 表示不确定的 java 类型

下面代码将包括泛型类,泛型方法,泛型接口进行说明

// 定义一个泛型类
class Box<T> {private T content;// 构造函数public Box(T content) {this.content = content;}// 获取盒子中的内容public T getContent() {return content;}// 设置盒子中的内容public void setContent(T content) {this.content = content;}
}// 定义一个泛型方法
class Util {// 泛型方法示例:交换数组中两个元素的位置// 注意:// 1.只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。// 2.<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。public static <T> void swap(T[] array, int i, int j) {T temp = array[i];array[i] = array[j];array[j] = temp;}
}// 定义一个泛型接口
interface Pair<K, V> {K getKey();V getValue();
}// 实现泛型接口
class OrderedPair<K, V> implements Pair<K, V> {private K key;private V value;public OrderedPair(K key, V value) {this.key = key;this.value = value;}public K getKey() {return key;}public V getValue() {return value;}
}public class Main {public static void main(String[] args) {// 使用泛型类Box<Integer> integerBox = new Box<>(10);System.out.println("Box contains: " + integerBox.getContent());// 使用泛型方法String[] names = {"Alice", "Bob"};Util.swap(names, 0, 1);System.out.println("Swapped names: " + names[0] + " and " + names[1]);// 使用泛型接口Pair<String, Integer> pair = new OrderedPair<>("one", 1);System.out.println("Key: " + pair.getKey() + ", Value: " + pair.getValue());}
}

2.泛型类

泛型类定义相对比较简单

泛型类,是在实例化类的时候指明泛型的具体类型

// 定义一个泛型类
class Box<T> {private T content;// 构造函数public Box(T content) {this.content = content;}// 获取盒子中的内容public T getContent() {return content;}// 设置盒子中的内容public void setContent(T content) {this.content = content;}
}

3.泛型方法

这里需要注意的是,很多人分不清泛型方法和使用泛型方法

泛型方法一定有<T>定义泛型,然后在参数列表使用泛型

使用泛型方法是通过拿类或者接口所定义的泛型来使用

// 定义一个泛型方法
class Util {// 泛型方法示例:交换数组中两个元素的位置// 注意:// 1.只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。// 2.<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。public static <T> void swap(T[] array, int i, int j) {T temp = array[i];array[i] = array[j];array[j] = temp;}
}

4.泛型接口

泛型接口和泛型类定义基本一致

// 定义一个泛型接口
interface Pair<K, V> {K getKey();V getValue();
}

5.特别强调

  •  1.只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
  •  2.<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
  •  3.注意泛型类型参数只能代表引用型类型,不能是原始类型(像 int、double、char 等)
  •  4.静态方法无法访问类上定义的泛型;如果静态方法操作的引用数据类型不确定的时候,必须要将泛型定义在方法上。
public class Model<T> {......../*** 如果在类中定义使用泛型的静态方法,需要添加额外的泛型声明(将这个方法定义成泛型方法)* 即使静态方法要使用泛型类中已经声明过的泛型也不可以。* 如:public static void demo(T t){..},此时编译器会提示错误信息:"StaticGenerator cannot be refrenced from static context"*/public static <T> void demo(T t){}
}

6.类型通配符

类型通配符一般是使用 ? 代替具体的类型参数。例如 List<?> 在逻辑

是 List<String>,List<Integer> 等所有 List<具体类型实参> 的父类。

import java.util.*;public class GenericTest {public static void main(String[] args) {List<String> name = new ArrayList<String>();List<Integer> age = new ArrayList<Integer>();List<Number> number = new ArrayList<Number>();name.add("icon");age.add(18);number.add(314);getData(name);getData(age);getData(number);}public static void getData(List<?> data) {System.out.println("data :" + data.get(0));}
}

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

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

相关文章

Ubuntu系统安装配置笔记

最近装了台Ubuntu系统用于日常工作&#xff0c;过程中搜索了很多资料或找ChatGPT解答疑问&#xff0c;已有的资料都比较详细了&#xff0c;因此这篇笔记主要是列举大纲和参考网站&#xff0c;并记录中间踩坑耗时较多的问题。 一&#xff0c;系统安装 1&#xff0c;镜像下载 …

2024数学建模时间汇总与竞赛攻略

目录 2024数学建模汇总&#xff08;时间、报名费、获奖率、竞赛级别、是否可跨校&#xff09; 中国高校大数据挑战赛 “华数杯”国际大学生数学建模竞赛 美国大学生数学建模竞赛&#xff08;美赛&#xff09; 数学中国&#xff08;认证杯&#xff09;数学建模网络挑战赛 …

盲盒一番赏小程序:打开未知的惊喜之旅

在快节奏的生活中&#xff0c;人们总是渴望寻找一份属于自己的小确幸。盲盒一番赏小程序&#xff0c;正是这样一个为你带来无尽惊喜与乐趣的平台。我们精心打造这一小程序&#xff0c;让每一次点击都成为一次全新的探索&#xff0c;让每一次选择都充满无限可能。 盲盒一番赏小…

dns高防和ip高防的区别是什么?

在面对日益增长的网络安全威胁时&#xff0c;DNS高防和IP高防作为防御策略发挥着重要的作用。虽然两者都旨在保护网络资源免受攻击&#xff0c;但它们在操作方式和防护重点上有着本质的不同。 DNS高防&#xff1a;保护域名解析服务DNS高防&#xff0c;全称是高防御的域名解析服…

JavaWeb--05Vue项目简介

Vue项目简介 1 创建vue项目2 Vue项目目录结构3 运行Vue项目3 Vue项目开发流程 1 创建vue项目 环境准备好了&#xff0c;接下来我们需要通过Vue-cli创建一个vue项目&#xff0c;然后再学习一下vue项目的目录结构。Vue-cli提供了如下2种方式创建vue项目: 命令行&#xff1a;直接…

应用编程之线程(二-同步篇)

线程的主要优势在于&#xff0c;资源的共享性&#xff0c;譬如通过全局变量来实现信息共享&#xff0c;不过这种便捷的共享是有代价的&#xff0c;那就是多个线程并发访问共享数据所导致的数据不一 致的问题。 一、为什么需要线程同步 线程同步是为了对共享资源的访问进行保护…

用Cmake编译程序时,链接到FFmpeg库

用Cmake编译程序时&#xff0c;链接到FFmpeg库 一、前言 可喜可贺&#xff0c;折腾了一晚上终于把这个勾八链接成功了&#xff0c;已经要吐了。看到下面控制台的输出&#xff0c;吾心甚慰呀&#x1f62d; [100%] Linking CXX executable rknn_yolov5_demo [100%] Built targe…

SpringBoot 操作 Redis

导入对应版本的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>修改配置文件中的信息 spring:redis:host: 127.0.0.1port: 8888注意: 我这里 xsh…

【python】深度解剖!一文搞懂字符串常用功能

【python】深度解剖!一文搞懂字符串常用功能 【先赞后看养成习惯】求点赞+关注+收藏😀 目录 【python】深度解剖!一文搞懂字符串常用功能字符串的创建:字符串的格式化——占位符.format方法字符串的分割字符串的连接字符串的重复字符串的大小写转换字符串的判断字符串的…

sherpa + ncnn 离线语音识别

目录结构 前言音视频格式转为wavsherpa-ncnn编译LinuxWindowswindows编译中遇到的问题问题“nmake -? failed with: no such file or directory”编译失败原因 成功编译截图 可执行程序说明模型下载语言识别测试LinuxWindows 参考文献 前言 小编需要实现离线音视频语言部分识…

C++ 程序的内存分配

C 程序的内存分配 C 程序的内存分配栈堆数据区程序代码区参考 C 程序的内存分配 一个 C 编译的程序占用内存分为以下几个部分&#xff08;从高地址到低地址&#xff09;&#xff1a; 内核空间&#xff1a;由操作系统创建并控制&#xff0c;用户代码不能读写。栈&#xff1a;由…

mysql 日环比 统计

接到一个任务&#xff0c;要计算日环比的情况。 16、查询销售额日环比情况 日环比&#xff1a; &#xff08;今日-昨日&#xff09;/ 昨日 的一个比率情况。 1&#xff0c;建表 DROP TABLE IF EXISTS sale; create table sale(id int not null AUTO_INCREMENT,record_date da…

IDEA插件:CodeGeex

前言 CodeGeeX是由清华大学和智谱AI联合开发的多语言代码生成模型。CodeGeeX是一款AI编程助手&#xff0c;其功能类似于Github Copilot、Codeium、CodeWhisperer、Bito等智能编程助手。CodeGeeX支持Python、C、Java、JavaScript、Go等10多种主流编程语言。它可以帮助程…

windows驱动开发-WDM框架(一)

在前面的文章中解释过&#xff0c;NT5.0之后windows确定了新的架构Windows Driver Model (WDM)&#xff0c;在Vista之后又推出了Windows Driver Framework(WDF)&#xff0c;这两个都属于驱动程序框架&#xff0c;那么它们的之间的关系是怎样的&#xff1f; WDF是对WDM进行的封…

天线基本原理;光纤传播信号原理;光纤怎么表示0,1的

目录 天线基本原理 电话,收音机,4G,5G 三大运营商频段划分 光纤传播信号原理

利用大语言模型,矢量数据库实现数据库的智能搜索

目的 数据库使用SQL 语言查询数据&#xff0c;数据库的记录中要有一个关键字段&#xff08;通常称为主键字段&#xff0c;它的值在数据库列表中是唯一的&#xff09;,数据记录是结构化的. 如果你需要根据数据记录的内容来查询数据记录&#xff0c;就需要通过Select 语句在数据库…

OpenCV杂记(1):绘制OSD(cv::getTextSize, cv::putText)

1. 简述 我们使用OpenCV时&#xff0c;有时会在图像的某个位置绘制OSD信息&#xff0c;如绘制一些字符串作为指示信息。 本文将简要介绍在图像&#xff08;cv::Mat&#xff09;上绘制固定的字符串信息。 2. 使用的API &#xff08;1&#xff09;cv::getTextSize() CV_EXPORT…

vue3 删除对象中的属性,可以使用js里的delete,但需注意ts定义对象类型!

如上如&#xff0c;当使用delete 删除stateData中的属性时&#xff0c; 报错&#xff0c;意思为 TypeScript 错误“‘delete’ 运算符的操作数必须是可选的 什么原因呢&#xff1f;是因为我偷懒 缺少了ts定义类型 方法一&#xff1a; &#xff08;不推荐&#xff09; delete …

MultiHeadAttention在Tensorflow中的实现原理

前言 通过这篇文章&#xff0c;你可以学习到Tensorflow实现MultiHeadAttention的底层原理。 一、MultiHeadAttention的本质内涵 1.Self_Atention机制 MultiHeadAttention是Self_Atention的多头堆嵌&#xff0c;有必要对Self_Atention机制进行一次深入浅出的理解&#xff0c;这…

Linux Makefile用法

1、什么是makefile&#xff1f; Makefile&#xff1a;将不同模块放在不同的目录中&#xff0c;定义一系列的规则进行 “自动化编译”2、Makefile写法 vim makefile 填写样例&#xff1a; app:sub.c add.c mult.c div.c main.cgcc sub.c add.c mult.c div.c main.c -o app3、工作…