Java-day12(泛型)

news2024/12/26 1:02:56

泛型

  • 解决元素存储的安全性问题

  • 解决获取数据元素时,需要类型强转的问题
    在这里插入图片描述

  • 核心思想:把一个集合中的内容限制为一个特定的数据类型 静态方法中不能使用类的泛型

  • 不能在catch中使用泛型

  • 如果泛型类是一个接口或抽象类,则不可创建泛型类的对象

  • 从泛型类派生子类,泛型类型需要具体化

1.在集合中使用泛型

import java.util.*;

public class Test{
	//在集合中没有使用泛型的情况下
	@org.junit.Test
	public void test1(){
		List list = new ArrayList();
		list.add(1003);
		list.add(1004);
		list.add(1005);
		//任何的Object及其子类对象都可以添加
		list.add("CA");

		for(int i = 0; i < list.size();i++){
			//强制转为int型时,报ClassCastException异常
			int id = (Integer)list.get(i);
			System.out.println(id);    
		}
	}
	//在集合中使用泛型的情况下
	@org.junit.Test
	public void test2(){
		List<Integer> list = new ArrayList<Integer>();这里的泛型是规定输入的要是Integer类型的数据
		list.add(1003);
		list.add(1004);
		list.add(1005);
		//list.add("CA");//此处输入其他数据类型,就会报错,不让输入

		// for(int i = 0; i < list.size();i++){
		// 	//强制转为int型时,报ClassCastException异常
		// 	int id = (Integer)list.get(i);
		// 	System.out.println(id);
		// }
		Iterator<Integer> i = list.iterator();
		while(i.hasNext()){
			System.out.println(i.next());
		}
	}
	//在集合Map中使用泛型的情况下
	@org.junit.Test
	public void test3(){
		Map<String,Integer> map = new HashMap<String,Integer>();//这里的泛型是规定的key要是String类型,Value要是Integer类型
		map.put("AA",23);
		map.put("AB",23);
		map.put("AC",23);
		map.put("AA",23);

		Set<Map.Entry<String,Integer>> set = map.entrySet();
		for(Map.Entry<String,Integer> o : set ){
			System.out.println(o.getKey() + "------>" + o.getValue());
		}
	}
}

2.自定义泛型类,泛型接口,泛型方法

  • 当实例化泛型类的对象时,指明泛型的类型,即指明之后,对应的类中所有使用泛型的位置,都变为实例化中指定的泛型的类型

  • 如果我们自定义了泛型类,但在实例化时没有使用,那么默认类型是Object
    DAO(database access object):数据访问对象

例:

 //自定义泛型类
import java.util.ArrayList;
import java.util.List;
public class Customer<T>{
	private Integer id;
	private String name;
	private T t;
	List<T> list = new ArrayList<>();
	public void add(){
		list.add(t);
	}
	public T getT(){
		return t;
	}
	public void setT(T t){
		this.t = t;           
	}
	//声明泛型方法
	public <C> C getC(C c){
		return c;
	}

	public Integer getId(){
		return id;
	} 
	public void setId(Integer id){
		this.id = id; 
	}
	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
	public Customer(String name,Integer id){ 
		super();
		this.name = name;
		this.id = id; 
	}
	public Customer(){
		super();
	}
	@Override
	public String toString(){ 
		return "Customer [name= " + name + ", id=" + id + "t= " + t + "]"; 
	}
}
//继承泛型类或接口时,可以指明泛型的类型
class Scustomer extends Customer<Integer>{

}
import java.util.List;
import org.junit.Test;
public class Test1{
	//自定义泛型类的使用
	@Test
	public void test1(){
		Customer<Boolean> customer = new Customer<Boolean>();        
		customer.setT(true);
		System.out.println(customer.getT());//true
		customer.add();
		List<Boolean> list = customer.list;
		System.out.println(list);//true

		Scustomer s = new Scustomer();
		List<Integer> list1 = s.list;
		System.out.println(list1);

		//泛型方法测试(当通过对象调用泛型方法时,指明泛型方法的类型)
		Integer a = customer.getC(66);
		Double b = customer.getC(8.8);
	}
}

3.泛型与继承的关系

若类A是类B的子类,那么List<A>就不是List<B>的子接口

4.通配符(?)

  • List<A>, List<B>…都是List<?>的子类
  • ? extends A:可以存放A及其子类
  • ? super A:可以存放A及其父类
  • 可以读取声明为通配符的集合的对象,但不能写入声明为通配符的集合的对象(null除外,它能写入)

例:

public class Test{
	@Test 
	public void test3(){
		List<?> list = null;
		List<Object> list1 = new ArrayList<Object>();
		List<String> list2 = new ArrayList<String>();
		list = list1;
		list = list2;
		//Integer 是 Number 的子类型
		// ? extends A:可以存放A及其子类(上限通配符)
		List<? extends Number> list3 = null;         
		List<Integer> list4 = null;
		list3 = list4;//成功
		list3 = list1;//不能执行

		// ? super A:可以存放A及其父类(下限通配符)
		List<? super Number> list5 = null;
		list5 = list1;//可以
	}
	@Test
	public void test4(){
		List<String> listed = new ArrayList<String>();
		listed.add("AA");
		listed.add("BB");
		listed.add("CC");
		List<?> listes = listed;
		//可以读取声明为通配符的集合的对象
		Iterator<?> iterator = listes.iterator();
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
		listes.add("DD");//添加失败,除null外都不可以写入
		listes.add(null);//null可以写入
	}
}

5.泛型练习

在这里插入图片描述

interface Info{ //此接口的子类表示人的信息

}
class Contact implements Info{//联系方式  
	private String phone_id;//联系方式
	private String zipcode;//邮编
	private String address;//联系地址
	public String  getAddress(){
		return address;
	}
	public void setAddress(String address){
		this.address = address;
	}

	public String getId(){
		return phone_id;
	} 
	public void setId(String phone_id){
		this.phone_id = phone_id;
	}
	public void setZipcode(String zipcode){
		this.zipcode = zipcode;
	}
	public String getZipcode(){
		return zipcode;
	}
	public Contact(String phone_id,String zipcode,String address){
		super();
		this.zipcode = zipcode;
		this.phone_id = phone_id;
		this.address = address;
	}
	public Contact(){
		super();
	}
	@Override
	public String toString(){
		return "Contact [address= " + address + ", phone_id=" + phone_id + "zipcode= " + zipcode + "]";
	}
}

class Information implements Info{//个人信息
	private String name;  //姓名
	private int age;      //年龄
	private String sex;   //性别

	public Information(String name,int age,String sex){
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	public Information(){
		super();
	}

	public String getSex(){
		return sex;
	}
	public void setSex(String sex){
		this.sex = sex;
	}

	public int getId(){
		return age;
	} 
	public void setId(int age){
		this.age = age;
	}
	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
	
	@Override
	public String toString(){
		return "Information [name= " + name + ", age=" + age + "sex:" + sex + "]";
	}
}

class Person<T extends Info>{
	private T info;
	public Person(T info){
		this.info = info;
	}
	public T getInfo(){
		return info;
	} 
	public void setIinfo(T info){
		this.info = info;
	}
	@Override
	public String toString(){
		return "Person [ info= " + info + "]";
	}
}
public class Test5{
	public static void main(String[] args) {
		Person<Contact> per = null;
		per = new Person<Contact>(new Contact("13599988881","05123","上海市"));
		System.out.println(per);

		Person<Information> per1 = null;
		per1 = new Person<Information>(new Information("黄某",18,"男"));
		System.out.println(per1);
	}
}

感谢大家的支持,关注,评论,点赞!
参考资料:
尚硅谷宋红康20天搞定Java基础中部

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

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

相关文章

Docker技术--Docker镜像管理

1.Docker镜像特性 ①.镜像创建容器的特点 Docker在创建容器的时候需要指定镜像,每一个镜像都有唯一的标识:image_id,也可也使用镜像名称和版本号做唯一的标识,如果不指定版本号,那么默认使用的是最新的版本标签(laster)。 ②.镜像分层机制 Docker镜像是分层构建的,并通过…

Springboot集成Docker并将镜像推送linux服务器

案例使用springboot项目&#xff0c;在IDEA 中集成Docker生成镜像&#xff0c;并将镜像发布到linux服务器 具体步骤如下&#xff1a; 1、Centos7安装Docker 更新系统的软件包列表 sudo yum update安装Docker所需的软件包和依赖项&#xff1a; sudo yum install docker完成…

vue3中右侧26个英文字母排列,点击字母,平滑到响应内容

效果图如下&#xff1a; 右侧悬浮 <!-- 右侧悬浮组件 --><div class"right-sort"><div v-for"(item, index) in list" :key"index" class"sort-item" :class"index activeIndex ? sort-item-active : " c…

大众汽车ceo施文韬到访中国,与中国团队会面,加速推出纯电产品

根据大众汽车官方公众号8月30日的消息透露&#xff0c;大众汽车乘用车品牌首席执行官施文韬和董事会成员上周到访了中国大众汽车总部V-SPACE。这次访问不仅与大众汽车中国团队和合资公司伙伴会面&#xff0c;还会见了经销商&#xff0c;并与中国核心媒体进行了沟通见面会。 中国…

固定式无线农业气象综合监测站

固定式无线农业气象综合监测站采用无线传输的方式&#xff0c;适合长距离之间的数据传输&#xff0c;用户可以在手机或者电脑登录并查看固定式无线农业气象综合监测站监测到的气象数据&#xff0c;稳定可靠。 技术特点&#xff1a; ①具有一路 ModBus-RTU 主站接口可接入485变…

运营商云强势崛起,互联网云开始艰难“守擂台”

大数据产业创新服务媒体 ——聚焦数据 改变商业 随着云计算的兴起&#xff0c;大佬纷纷入局赛道&#xff0c;阿里巴巴2009年正式成立阿里云&#xff0c;腾讯、百度、华为等企业也在2016年前后加速布局云计算产业。除此之外&#xff0c;中国电信、移动、联通等玩家也各有动作&a…

基于机器学习的fNIRS信号质量控制方法

摘要 尽管功能性近红外光谱(fNIRS)在神经系统研究中的应用越来越广泛&#xff0c;但fNIRS信号处理仍未标准化&#xff0c;并且受到经验和手动操作的高度影响。在任何信号处理过程的开始阶段&#xff0c;信号质量控制(SQC)对于防止错误和不可靠结果至关重要。在fNIRS分析中&…

DNS 协议都没听过?你配做开发?

一、什么是DNS协议&#xff1f; DNS协议是一种用于将域名转换为IP地址的分布式命名系统。它通过将用户提供的域名映射到相应的IP地址&#xff0c;实现了互联网上资源的定位和访问。DNS协议采用了层次化的域名结构&#xff0c;使得域名之间可以建立逻辑上的关联。 二、DNS解析过…

vs2019 ,c++的STD库全局函数 _Pocma 与 _Swap_adl 的思考

&#xff08;1&#xff09;在阅读vs2019上的 STL库的 map 源码时&#xff0c;遇到了这个函数&#xff0c;之前&#xff0c;在别的源码中也经常出现这个函数。那么这个函数起什么作用呢&#xff1f; 在1880行&#xff0c;有对该函数的调用。其定义如下图&#xff1a;&#xff0…

Redis 7 第二讲 数据类型 基础篇

&#x1f339; 引导 Commands | Redishttps://redis.io/commands/Redis命令中心&#xff08;Redis commands&#xff09; -- Redis中国用户组&#xff08;CRUG&#xff09;Redis命令大全&#xff0c;显示全部已知的redis命令&#xff0c;redis集群相关命令&#xff0c;近期也会…

竟大规模放弃复试!你未战先怯,别跑!

一、学校及专业介绍 长沙理工大学简称长沙理工&#xff08;CSUST&#xff09;&#xff0c;位于湖南省长沙市&#xff0c;国家交通运输部和湖南省人民政府共建高校&#xff0c;湖南省“双一流”建设高校&#xff0c;学校由原国家交通部所属的长沙交通学院和原国家电力公司&…

高频面试题:如何分别用三种姿势实现三个线程交替打印0到100

最近面试遇到的一道题&#xff0c;需要三个线程交替打印0-100&#xff0c;当时对多线程并不是很熟悉因此没怎么写出来&#xff0c;网上搜了之后得到现 synchronized wait/notifyAll 实现思路&#xff1a;判断当前打印数字和线程数的取余&#xff0c;不等于当前线程则处于等待…

前端:横向滚动条,拖动进行左右滚动(含隐藏滚动条)

效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

【算法系列篇】位运算

文章目录 前言什么是位运算算法1.判断字符是否唯一1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 丢失的数字2.1 题目要求2.2 做题思路2.3 Java代码实现 3. 两数之和3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 只出现一次的数字4.1 题目要求4.2 做题思路4.3 Java代码实现 5.…

数据库范式以及drop、delete 与 truncate区别

数据库范式了解吗? 我们从一个数据库设计的初始化阶段开始, 但是并没有规范化设计的背景知识 而要求我们设计一个员工管理系统, 可能得到表结构如下: 数据异常 首先这个表有如下问题: 1. 数据冗余: 我们可以看到部门名称相同时, 部门地址也是重复的 因此会重复存储数据 …

【UE5】给模型指定面添加自定义材质

实现步骤 1. 首先我们向UE中导入一个简单的模型&#xff0c;可以看到目前该模型的材质插槽只有一个&#xff0c;当我们修改材质时会使得模型整体的材质全部改变&#xff0c;如果我们只想改变模型的某些面的材质就需要继续做后续操作。 2. 选择建模模式 3. 在模式工具栏中点击…

手机改图片文字软件有哪些?简单分享这几款

手机改图片文字软件有哪些&#xff1f;现在有很多手机APP可以帮助我们实现图片中文字的提取和修改&#xff0c;但是其中一些工具可能会缺乏一些必要的功能&#xff0c;或者不太适合某些特定的用途。在这篇文章中&#xff0c;我们将介绍几款非常实用的手机改图片文字软件。 第一…

复杂性管理与重复性管理

在前面我们说到了所谓的"计算机科学", 重点在于如何控制大型系统的复杂性. 复杂性本身当然也是个很大的话题, 而一种常见的复杂性的来源则是重复性, 即是由不断的重复所带来的复杂性. 重复性带来的复杂性常被人忽视, 大概是因为一开始它是不起眼的, 而当人们意识到它…

软技能的重要性:在面试中展示团队合作与沟通能力

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…