JavaSE——泛型编程

一、为什么要引入泛型编程

        看这段代码:

//传统方法:
ArrayList list = new ArrayList();
list.add(new Dog("小黄",5));
list.add(new Dog("小黑",1));
list.add(new Dog("小财",10));
//编译器发现不了这种问题,它是不安全的
list.add(new Cat("招财猫",8));
for(Object o:list){//向下转型Dog d = (Dog)o;System.out.println(d.getName() + "-" + d.getAge());
}

        传统方法的问题分析:

  1. 不能对加入到集合中的数据类型进行约束,这里编译器发现不了,但是实际会抛出异常。
  2. 遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响。

泛型解决上面这个问题:

//ArrayList<Dog>表示存放到ArrayList集合中的元素是Dog类型
//如果编译器发现添加的类型不满足要求就会报错
//遍历时可以直接取出Dog类型而不是Object
ArrayList<Dog> list = new ArrayList<Dog>();
list.add(new Dog("小黄",5));
list.add(new Dog("小黑",1));
list.add(new Dog("小财",10));
//现在编译器可以发现这种问题,它是不安全的
//list.add(new Cat("招财猫",8));
//可以直接取出Dog,不需要向下转型
for(Dog o:list){System.out.println(o.getName() + "-" + o.getAge());
}

二、什么是泛型 

  1. 泛型又称参数化类型,解决数据类型的安全性问题。
  2. 在类声明或者实例化只要指定化需要的具体的类型即可。
  3. Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。
  4. 泛型的作用是:可以在类声明时通过一个标识表示类中某个属性的类型,或者某个方法的返回值的类型,或者是参数类型。
class persop<E> {//E表示 s的数据类型,该数据类型在定义person对象的时候确定,// 即在编译期间,就确定E是什么类型E s;//也可以是参数类型public persop(E s) {this.s = s;}//做返回类型public E f(){return s;}
}

三、泛型的使用细节

  1. 泛型必须是引用类型。
  2. 在给泛型指定具体类型后,可以传入子类型。
  3. 泛型使用形式:
List<Integer> list1 = new ArrayList<Integer>();
ArrayList<Integer> list2 = new ArrayList<Integer>();List<Integer> list3 = new ArratList<>();
ArrayList<Integer> list4 = new ArrayList<>();//这样写,泛型默认是Object
ArrayList arraylist = new ArrayList();

四、自定义泛型

4.1自定义泛型类

基本语法:

class 类名<T,R...>{//...表示可以有多个泛型成员
}
  1. 普通成员可以使用泛型。
  2. 使用泛型的数组不可以初始化。
  3. 静态方法中,不能使用类的泛型。
  4. 泛型类的类型,是在创建对象时确定的(因为创建对象时,需要指定类型)。
  5. 如果在创建对象时没有指定类型,默认为Object 。
class Tiger<T,R,M>{String name;//属性使用泛型R r;M m;T t;//数组在new时不能确定T的类型,不能直接实例化//T[] ts = new T[8];public Tiger(String name, R r, M m, T t){//构造器使用泛型this.name = name;this.r = r;this.m = m;this.t = t;}//静态方法不能使用泛型//静态是和类相关的,在类加载时,对象还没有初始化//此时如果静态方法和静态属性使用了泛型,JVM就无法完成初始化。//public static void fun(M m){}
}

4.2自定义泛型接口 

基本语法:

interface 接口名<T,R...>{
}
  1. 接口中,静态成员不能使用泛型。
  2. 泛型接口的类型在继承接口或者实现接口时确定。
  3. 没有指定类型则默认为Object。 
interface IUsb<U,R>{}
//实现时指定
class c implements IUsb<String,Interger>//继承时指定
interface MyInterface extends IUsb<String,Integer>{}、
//这时会自动替换
class D implements MyInterface{}

4.3自定义泛型方法 

修饰符<T,R...>返回类型 方法名(参数列表){}
  1. 泛型方法可以定义在普通类中,也可以定义在泛型类中。
  2. 当泛型方法被调用时,类型会确定。

4.4泛型的继承

  1. 泛型不具备继承性
    //错误,泛型是不存在继承的
    List<Object> list = new ArrayList<String>();
  2. <?>表示支持任意泛型。
  3. <? extends A>表示支持A类以及A类的子类,规定了泛型的上限。
  4. <? super A>表示A类以及A类的父类,不限于直接父类,规定了泛型的下限。
public static void printColleaction1(List<?> a) {}//表示可以接收AA类或者AA类的子类
public static void printColleaction2(List<? extends AA> a) {}//表示可以接收AA类以及AA类的父类
public static void printColleaction3(List<? super AA> a) {}class AA{}
class BB extends AA{}
class CC extends BB{}

 

 

 

        

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

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

相关文章

深度优先的艺术:探索二叉树的深搜算法精髓

文章目录 前言☀️一、计算布尔二叉树的值&#x1f319;解法⭐代码 ☀️二、求根节点到叶节点数字之和&#x1f319;解法⭐代码 ☀️三、二叉树剪枝&#x1f319;解法⭐代码 ☀️四、验证二叉搜索树&#x1f319;解法☁️步骤⭐代码 ☀️五、二叉搜索树中第k小的元素&#x1f3…

VB.net进行CAD二次开发(二)与cad交互

开发过程遇到了一个问题&#xff1a;自制窗口与控件与CAD的交互。 启动类&#xff0c;调用非模式窗口 Imports Autodesk.AutoCAD.Runtime Public Class Class1 //CAD启动界面 <CommandMethod("US")> Public Sub UiStart() Dim myfrom As Form1 New…

linux ls -l 输出 drwxr-xr-x 2 root root 4096 Dec 5 21:48 rootTest 是什么意思

在Linux系统中&#xff0c;ls -l命令用于以长格式列出目录内容的详细信息。输出的一行通常包含以下部分&#xff1a; drwxr-xr-x 2 root root 4096 Dec 5 21:48 rootTest这一行的各个部分意义如下&#xff1a; drwxr-xr-x&#xff1a;这是文件类型和权限的标识。 第一个字符d…

python学opencv|读取图像(五)读取灰度图像像素

【1】引言 前序学习了图像的基本读取&#xff0c;掌握了imread()、imshow()和imwrite()函数的基本功能和使用技巧&#xff0c;参考文章链接为&#xff1a; python学opencv|读取图像-CSDN博客 然后陆续掌握了彩色图像保存、图像放大和缩小以及对imshow()函数的大胆尝试技巧&a…

基于yolov8的SAR影像目标检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测、图像分类识别、目标追踪等项目可看我主页其他文章 功能演示&#xff1a; 基于yolov8的SAR影像目标检测系统&#xff0c;支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov8的SAR影像目标…

2.Flink的项目初始化和Hello-world

目录 1.Flink项目初始化 2.Hello-world 1.Flink项目初始化 新建maven项目或者gradle项目&#xff0c;这里使用maven项目为例。 在项目的pom.xml文件中添加Flink依赖&#xff0c;如下所示&#xff0c;为Hello-World例子的最小依赖&#xff1a; <properties><maven.c…

ESP32开发 云调试

https://blog.csdn.net/weixin_43794311/article/details/128722001 VScode支持的仿真平台 https://docs.wokwi.com/zh-CN/vscode/getting-started 编译&#xff1a;Ctrl Alt B上传并重启模拟器&#xff1a;CtrlShifB Wokwi:Start Simulator调试&#xff1a;CtrlShifB Wokwi…

如何写出一篇好的论文?

写出一篇好的论文需要综合多方面的要素&#xff0c;从选题到最终成文&#xff0c;每一步都至关重要。首先&#xff0c;明确研究主题和目标&#xff0c;确保选题具有创新性、可行性和实际意义。接着&#xff0c;进行深入的文献检索和综述&#xff0c;了解当前领域的研究现状和前…

模版方法模式的理解和实践

在软件开发中&#xff0c;设计模式为我们提供了一套经过验证的解决方案&#xff0c;用于解决常见的设计问题。其中&#xff0c;模版方法模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个算法的框架&#xff0c;并允许子类在不改…

洛谷【排序】算法的题单 - 笔记

2024-12-09 - 第 37 篇 洛谷【排序】题单 - 笔记 作者(Author): 郑龙浩 / 仟濹(CSND账号名) 洛谷【排序】题单合集 一、排序算法都有… 1. 简单排序算法 这些算法通常是基础的排序方法&#xff0c;容易理解和实现&#xff0c;但效率较低&#xff0c;适用于数据量较小的情况…

MySQL--》如何在SQL中巧妙运用函数与约束,优化数据处理与验证?

目录 函数使用 字符串函数 数值函数 日期函数 流程函数 约束 函数使用 函数是指一段可以直接被另一段程序调用的程序或代码&#xff0c;在mysql当中有许多常见的内置函数&#xff0c;接下来开始对这些内置函数及其作用进行简单的讲解和使用&#xff1a; 字符串函数 my…

归有光,情感与真实的独行者

归有光&#xff0c;字熙甫&#xff0c;号震川&#xff0c;生于明孝宗弘治十年&#xff08;公元1507年&#xff09;&#xff0c;卒于明穆宗隆庆五年&#xff08;公元1571年&#xff09;&#xff0c;享年64岁。他是中国明代著名的散文家、文学家和史学家&#xff0c;其散文风格清…

Python + OpenCV 系列:图像阈值处理

文章目录 引言 1. 阈值处理的基本概念2. OpenCV 中的阈值处理3. 常见的阈值类型3.1 二值化阈值3.2 反向二值化阈值3.3 截断阈值3.4 平滑阈值 4. 自适应阈值5. Otsu’s 阈值法6. 阈值处理的应用场景7. 总结 引言 图像阈值处理是计算机视觉和图像处理中一种非常基础而重要的技术…

计算机网络-Wireshark探索ARP

使用工具 Wiresharkarp: To inspect and clear the cache used by the ARP protocol on your computer.curl(MacOS)ifconfig(MacOS or Linux): to inspect the state of your computer’s network interface.route/netstat: To inspect the routes used by your computer.Brows…

Vue3小兔鲜电商项目

创建项目 npm install 装包

【NLP 12、深度学习15条调参经验】

反正是绚烂&#xff0c;反正是到来 反正是背负慢慢凋残的孤独 耀眼的孤独&#xff0c;义无反顾的孤独 —— 24.12.9 深度学习15条调参经验 1.调参 调参是锦上添花的事&#xff0c;而底线取决于模型的选择和数据的清洗 2.关于model ① 尽量不要自己手写模型&#xff0c;找一…

美畅物联丨视频接入网关如何配置 HTTPS 证书

在安防领域&#xff0c;视频接入网关&#xff08;Video Access Gateway&#xff0c;VAG&#xff09;是视频监控系统的重要组成部分&#xff0c;其职责是把视频数据从前端设备传输至后端服务器。配置HTTPS证书后&#xff0c;可对视频流进行加密传输&#xff0c;避免数据在网络传…

fastcam编程套料软件

Fastcam是一款功能强大的专业软件&#xff0c;以下是对它的具体介绍&#xff1a; 基本信息 • Fastcam自1982年推出首个交互式CNC编程和套料系统后&#xff0c;一直不断更新发展. • 它是为数控火焰、等离子、激光和水射流切割机等数控切割机开发的编程套料软件. 主要功能模…

【大语言模型】LangChain ModelsIO与Models I/O Promopts详解

【大语言模型】LangChain ModelsIO与Prompts详解 一、LangChain ModelsIO1、简介2、Models I/O 的应用场景3、Models I/O 主要模块3.1、Prompts3.2、Modelsa、MESSAGES 类型 3.3、Output Parsers 二、LangChain ModelsIO Prompts1、简介2、Prompts 的优点3、实战示例3.1、Promp…

MicroBlaze软核开发(三):DDR + FLASH

实现功能&#xff1a;使用 MicroBlaze软核&#xff0c;配置 DDR、Flash 接口&#xff0c;并将程序烧写固化到Flash&#xff0c;每次启动 FPGA 时自动运行 Flash 中的程序 。 Vivado版本&#xff1a;2018.3 FPGA&#xff1a;Xilinx Artix-7 系 目录 引言 Vivado部分&#xff1…