泛型的相关内容

首先我们来了解一下什么是泛型,泛型的作用又是什么。

泛型的形式是

ArrayList<Object> objects = new ArrayList<>();

这里的<Object>这个就是泛型,添加泛型的作用又是什么呢,它可以限制添加对象的类型,比如AarryLsit<Object>则ArrayList只能存放Object类型的元素,这个好处是什么,当我们设置泛型时可以避免一些传入对象类型不对的情况,接下来我们示范一些实际案例:

要求ArraryList当中的元素必须是Person

首先我们来看一下没有有定义泛型的情况:

import java.util.ArrayList;public class Array {@SuppressWarnings({"all"})public static void main(String[] args) {ArrayList arrayList = new ArrayList();arrayList.add(new Preson("jack", 18));arrayList.add(new Preson("monkey", 18));arrayList.add(new Cat("mack", 23));System.out.println(arrayList);}
}class Preson{public String name;public int age;public Preson(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Preson{" +"name='" + name + '\'' +", age=" + age +'}';}
}class Cat{public String name;public int age;public Cat(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Cat{" +"name='" + name + '\'' +", age=" + age +'}';}
}

我们发现添加Cat类型的对象也是可以添加上去的,这里就不符合我们添加对象的限制,当我们

添加一下泛型时看一下是否能限制不符合要求对象的加入。

这里我们发现当我们添加泛型之后我们发现当我们想添加Cat类型的对象的时候我们发现该语句报错了,这就是泛型的作用。

泛型的作用也不止于此,它还可以应用在方法当中,即泛型方法:

class Person<E> {
        
        public Person(E s) {//E 也可以是参数类型
        this.s = s;
        }
}
这里就是我们的泛型类和泛型构造器,E是通过你传入的对象类型自动进行替换如果传入的是String类型则这个E就是String类型,依次类推;
public E f() {// 返回类型使用 E
        return s;
}
public class Array {@SuppressWarnings({"all"})public static void main(String[] args) {Dog1<String> wc = new Dog1<>("旺财");System.out.println(wc.f());}
}
class Dog1<E>{public E s;public Dog1(E s) {this.s = s;}public E f(){return s;}
}
这里我们发现E类型就变成了String类型。
当我们没有定义泛型时默认E为Object类型,而且泛型最好不要与静态属性定义在一块,因为二者是冲突的,没有确定E类型的时候是无法进行初始化的,泛型的定义不是一定要用E来表示也可以是其他的比如T,S,P等等,泛型的定义必须是引用类型,基本数据类型无法定义泛型。
泛型可以定义多个比如:
class Tiger<S, T, M>{
        String name;
        S s;
        T t;
        M m;
泛型的使用范围很广,可以定义属性,返回类型,数组(泛型定义的数组,不能进行初始化,因为类型不确定,所以无法开辟空间),接口等等,泛型一旦被定义一个固定的引用类型,即可传入本类或者其子类的类型。
接下来我们看一个泛型的实例演示:
题目要求:
代码展示:
import java.util.ArrayList;
import java.util.Comparator;public class inclass {public static void main(String[] args) {@SuppressWarnings({"all"})ArrayList<Employees> employees = new ArrayList<>();employees.add(new Employees("zzh", 50000, new MyData(2003, 9, 21)));employees.add(new Employees("hsx", 30000, new MyData(2002, 10, 11)));employees.add(new Employees("ksx", 30000, new MyData(2002, 10, 11)));System.out.println(employees);System.out.println("=====排序后的结果");employees.sort(new Comparator<Employees>() {@SuppressWarnings({"all"})@Overridepublic int compare(Employees emp1, Employees emp2) {if (!(emp1 instanceof Employees && emp2 instanceof Employees)) {return 0;}//是否为Employees类或者子类如果不是则返回0退出比较int i = emp1.getName().compareTo(emp2.getName());if (i != 0){return i;}//比较姓名的字符大小int year = emp1.getMydata().getYear() - emp2.getMydata().getYear();if (year != 0){return year;}//在姓名相同的情况下比较年份大小int monuth = emp1.getMydata().getMonuth() - emp2.getMydata().getMonuth();if (monuth != 0){return monuth;}//在前两者都相同的情况下比较月份大小return emp1.getMydata().getDay() - emp2.getMydata().getDay();//前三者都相同的话再进行天数的判断}});System.out.println(employees);}
}class Employees{private String name;private int dale;private MyData mydata;public Employees(String name, int dale, MyData mydata) {this.name = name;this.dale = dale;this.mydata = mydata;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getDale() {return dale;}public void setDale(int dale) {this.dale = dale;}public MyData getMydata() {return mydata;}public void setMydata(MyData mydata) {this.mydata = mydata;}@Overridepublic String toString() {return "Employees{" +"name='" + name + '\'' +", dale=" + dale +", mydata=" + mydata +'}';}
}class MyData{private int year;private int monuth;private int day;public MyData(int year, int monuth, int day) {this.day = day;this.monuth = monuth;this.year = year;}public int getDay() {return day;}public void setDay(int day) {this.day = day;}public int getMonuth() {return monuth;}public int getYear() {return year;}public void setYear(int year) {this.year = year;}public void setMonuth(int monuth) {this.monuth = monuth;}@Overridepublic String toString() {return "MyData{" +"year=" + year +", monuth=" + monuth +", day=" + day +'}';}
}

泛型的相关内容我们就聊到这里。

      

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

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

相关文章

黑马点评05分布式锁 1互斥锁和过期时间

实战篇-09.分布式锁-基本原理和不同实现方式对比_哔哩哔哩_bilibili 1.分布式锁 因为jvm内部的sychonized锁无法在不同jvm之间共享锁监视器&#xff0c;所以需要一个jvm外部的锁来共享。 2.redis setnx互斥锁 加锁解锁即可 2.1不释放锁可能死锁 redis 的setnx不会自动释放锁…

用CC三维建模建出的OSGB格式,用模方打不开,显示该路径包含OSGB瓦块数量0,是什么原因?

答&#xff1a;模方只识别tile命名的模型文件&#xff0c;此模型是不分块输出&#xff0c;要平面切块重新跑。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能&…

巴贝拉葡萄酒是单一品种还是混合品种制成的?

大多数巴贝拉葡萄酒都是由单一的巴贝拉葡萄品种制成的&#xff0c;许多意大利葡萄酒商开始尝试在巴贝拉葡萄酒中加入其它葡萄品种&#xff0c;其中两个最受欢迎的意大利品种是皮埃蒙特的巴贝拉德阿尔巴和达斯蒂。和朋友在一家意大利餐厅吃饭&#xff0c;被酒单吓到了&#xff1…

10.1Linux输入子系统介绍

输入设备介绍 鼠标、键盘、按键、触摸屏等提供输入支持的设备都属于输入设备&#xff0c;在Linux也提供了一套驱动框架“input 子系统”与之对应&#xff0c;用于抽象输入设备&#xff0c;并提供管理输入设备驱动和输入事件处理程序的功能 input 子系统 input 子系统用于管理…

GPT 魔力涌现

GPT 二、Prompt 的典型构成 角色&#xff1a;给 AI 定义一个最匹配任务的角色&#xff0c;比如&#xff1a;「你是一位软件工程师」「你是一位小学老师」指示&#xff1a;对任务进行描述上下文&#xff1a;给出与任务相关的其它背景信息&#xff08;尤其在多轮交互中&#xff…

Java: Random

/*** encoding: utf-8* 版权所有 2023 涂聚文有限公司* 许可信息查看&#xff1a;* 描述&#xff1a; //https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/RandomStringUtils.html* //https://commons.apache.org/pro…

详解RTC:以华人文化打造链上生态

文化是人类在发展的历史长河中淘洗出来的智慧结晶&#xff0c;随着人类社会的进步和变迁&#xff0c;经历了从口口相传到互联网等不同历史时代的传承和创新。在数字技术飞速发展的当今&#xff0c;区块链技术为文化的创新与传承提供了全新的空间和方式&#xff0c;使其得以在新…

ACL与NAT

目录 一、ACL &#xff08;一&#xff09;ACL基本理论 &#xff08;二&#xff09;ACL的类型 1.基本ACL 2.高级ACL 3.二层ACL &#xff08;三&#xff09;基本原理 &#xff08;四&#xff09;项目实验 通配符掩码 二、NAT &#xff08;一&#xff09;基本理论 &am…

ansible的基本使用

本章主要介绍在RHEL8中如何安装ansible 及 ansible 的基本使用。 ansible是如何工作的在 RHEL8中安装ansible编写ansible.cfg和清单文件ansible 的基本用法 如果管理的服务器很多&#xff0c;如几十台甚至几百台&#xff0c;那么就需要一个自动化管理工具了&#xff0c; ansi…

跟随鼠标动态显示线上点的值(基于Qt的开源绘图控件QCustomPlot进行二次开发)

本文为转载 原文链接&#xff1a; 采用Qt快速绘制多条曲线&#xff08;折线&#xff09;&#xff0c;跟随鼠标动态显示线上点的值&#xff08;基于Qt的开源绘图控件QCustomPlot进行二次开发&#xff09; 内容如下 QCustomPlot是一个开源的基于Qt的第三方绘图库&#xff0c;能…

打工人副业变现秘籍,某多/某手变现底层引擎-Stable Diffusion 黑白老照片上色修复

在这个时代,我们习惯于拥有高清、色彩丰富的照片,然而,那些古老的黑白色老照片由于年代的久远,往往会出现模糊、破损等现象。 那么今天要给大家介绍的是,用 Stable Diffusion 来修复老照片。 前段时间 ControlNet 的除了上线了“IP-Adapter”模型以外还增加另一个…

【深度学习】TensorFlow深度模型构建:训练一元线性回归模型

文章目录 1. 生成拟合数据集2. 构建线性回归模型数据流图3. 在Session中运行已构建的数据流图4. 输出拟合的线性回归模型5. TensorBoard神经网络数据流图可视化6. 完整代码 本文讲解&#xff1a; 以一元线性回归模型为例&#xff0c; 介绍如何使用TensorFlow 搭建模型 并通过会…

【Android12】Android Framework系列--AMS启动Activity分析

AMS启动Activity分析 通过ActivityManagerService(AMS)提供的方法&#xff0c;可以启动指定的Activity。比如Launcher中点击应用图标后&#xff0c;调用AMS的startActivity函数启动应用。 AMS提供的服务通过IActivityManager.aidl文件定义。 // frameworks/base/core/java/an…

Python将已标注的两张图片进行上下拼接并修改、合并其对应的Labelme标注文件(v2.0)

Python将已标注的两张图片进行上下拼接并修改、合并其对应的Labelme标注文件&#xff08;v2.0&#xff09; 前言前提条件相关介绍实验环境上下拼接图片并修改、合并其对应的Labelme标注文件代码实现输出结果 前言 此版代码&#xff0c;相较于Python将已标注的两张图片进行上下拼…

区块链的可扩展性研究【06】Plasma

1.Plasma&#xff1a;Plasma 是一种基于以太坊区块链的 Layer2 扩容方案&#xff0c;它通过建立一个分层结构的区块链网络&#xff0c;将大量的交易放到子链上进行处理&#xff0c;从而提高了以太坊的吞吐量。Plasma 还可以通过智能合约实现跨链交易&#xff0c;使得不同的区块…

【️Zookeeper是CP还是AP的?】

&#x1f60a;引言 &#x1f396;️本篇博文约3000字&#xff0c;阅读大约10分钟&#xff0c;亲爱的读者&#xff0c;如果本博文对您有帮助&#xff0c;欢迎点赞关注&#xff01;&#x1f60a;&#x1f60a;&#x1f60a; &#x1f5a5;️Zookeeper是CP还是AP的&#xff1f; ✅…

2024年20多个最有创意的AI人工智能点子

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 探索 2024 年将打造的 20 个基于人工智能产品的盈利创意 &#x1f525;&#x1f525;&#x1f525; 直到最近&#xff0c;企业对人工智能还不感兴趣&#xff0c;但…

浅析AI视频分析与视频管理系统EasyCVR平台及场景应用

人工智能的战略重要性导致对视频智能分析的需求不断增加。鉴于人工智能视觉技术的巨大潜力&#xff0c;人们的注意力正在从传统的视频监控转移到计算机视觉的监控过程自动化。 1、什么是视频分析&#xff1f; 视频分析或视频识别技术&#xff0c;是指从视频片段中提取有用信息…