Java-day12(泛型)

这篇具有很好参考价值的文章主要介绍了Java-day12(泛型)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

泛型

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

  • 解决获取数据元素时,需要类型强转的问题
    Java-day12(泛型),Java,java,泛型

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

  • 不能在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.泛型练习

Java-day12(泛型),Java,java,泛型

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基础中部文章来源地址https://www.toymoban.com/news/detail-683444.html

到了这里,关于Java-day12(泛型)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 0基础学java-day26(满汉楼实战)

    2.1 用户登录 2.2 显示餐桌状态  2.3 预订 2.4 显示菜品  2.5 点餐 2.6 查看账单  2.7 结账 1.1 构建如下的项目结构 1.2 导入相关的工具类和jar包 相关的工具类和jar包会放在评论区的百度网盘的链接中 1.3 整体项目结构  1.4 相关sql语句,也就是要建立的表 一个类就对应一张表,如果

    2024年01月16日
    浏览(42)
  • 0基础学java-day25(JDBC 和数据库连接池)

    1.1 方式 1 1.2 方式 2  1.3 方式 3  1.4 方式 4  1.5 方式 5    1.6 课堂练习  2.1 基本介绍  2.2 应用实例 3.1 基本介绍  3.2 演示的sql语句  3.3 应用实例 ​ 4.1 基本介绍 4.2 预处理好处  4.3 应用案例  模拟经典的转账业务 【package utils】   【package domain】 【dao】 【test】

    2024年01月18日
    浏览(42)
  • 【JAVA-Day03】JDK安装与IntelliJ IDEA安装、配置环境变量

    博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《java 面试题大全》 🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭 《MYSQL从入门到精通》数据库是开发者必会基础之一~ 🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄

    2024年02月02日
    浏览(81)
  • Java阶段二Day12

    JDBC Java数据库连接 Java Database Connectivity ,是java官方提供的一套结构,用于连接DBMS并进行相关操作 核心接口 Connection: 表示数据库连接 Statement: 用来执行SQL语句的语句对象 PreparedStatement: 用来执行预编译SQL语句的语句对象用来表示查询结果集 ResultSet: 用来表示查询结构集

    2024年02月01日
    浏览(38)
  • Java小白的学习之路——day12

    目录 一、final 什么是final? 二、接口概述  什么是接口? 与抽象类的区别 常量接口 接口传参多态 四、内部类 什么是内部类? 成员内部类 静态内部类 局部内部类 final从字面意思来看时最终的,不可改变的含义,它可以修饰在类、方法以及变量中 值得注意的是:final修饰类

    2024年02月13日
    浏览(50)
  • 详解Java中的泛型(泛型的语法,擦除机制,泛型的上界)

    目录 一.什么是泛型 二.Java中为什么要使用泛型 三.泛型的语法 四.泛型类的使用 五.泛型的编译机制(擦除机制) 六.泛型的上界 泛型(Generics)是Java SE 5中引入的一个新特性,可以 使Java中的类和方法具有更广泛的类型范围 。通俗的说,它使得我们可以在定义类和方法时指定

    2024年02月05日
    浏览(48)
  • Java自定义泛型类、泛型接口、泛型方法以及 泛型擦除的细节

    体会:使用泛型的主要优点是能够在 编译时 而不是在运行时检测错误。 1.泛型类可能有多个参数,此时应将多个参数一起放在尖括号内。比如:E1,E2,E3 2.泛型类的构造器如下:public GenericClass(){}。而下面是错误的:public GenericClass E (){} 3.实例化后,操作原来泛型位置的结构必

    2024年02月08日
    浏览(41)
  • 【Java】 泛型擦除

    原因一:JDK1.5及1.5之前都是没有泛型的概念的,JDK1.5之后引入了泛型的概念并为了与之前的JDK版本兼容,所以引入了泛型擦除的概念。 原因二:若对每个泛型类型都生成不同的目标代码,现有10个不同泛型的List,就要生成10份字节码,这样会造成不仅造成代码膨胀,而且一份

    2024年01月23日
    浏览(37)
  • Java泛型机制

    ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:每天一个知识点 ✨特色专栏: MySQL学习 🥭本文内容:Java泛型机制 🖥️个人小站 :个人博客,欢迎大家访问 📚个人知识库: 知识库,欢迎大

    2024年02月10日
    浏览(44)
  • java基础——泛型

    看下面这段代码: 如果没有泛型,要实现不同类型的加法,每种类型都需要重载一个add方法;通过泛型,我们可以复用为一个方法: 泛型中的类型在使用时指定,不需要强制类型转换( 类型安全 ,编译器会 检查类型 ) 下面这段代码: 我们在使用上述list中,list中的元素都

    2024年02月15日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包