java泛型机制

  • 泛型概述

  • 泛型使用的必要性

  • 泛型类

  • 泛型接口

  • 泛型对象引用传递的解决方案

  • 泛型方法

  • 泛型的简单应用
    本文中将介绍泛型的基础知识以及简单应用,后面还计划学泛型的擦除机制以及在集合和反射机制中的应用

泛型的概述

泛型,字面上理解就是广泛的数据类型。其实就是将数据类型进行参数化,可以达到进一步的代码复用和使得程序更安全的目的

  • 泛型的基本定义
    泛型的特点:在声明一个变量或者属性的时候不设置其数据类型,而是在指定结构使用的时候进行动态的配置。使用泛型解决了强制类型转化的设计缺陷

泛型的必要性

在生活中信息的发送是并不可少的,但信息表达的方式也是不尽相同的。怎样实现代码复用得接收不同类型的消息显得很重要

不使用泛型的设计

//用于接收不同类型的消息
class Massage{
	private Object content;//用Object接收所以类型的消息
	public Massage(Object content){
		setContent(content);
	}
	public Object getContent(){
		return content;
	}
	public void setContent(Object content){
		this.content=content;
	}
	public void sentMassage(){
		System.out.println(content);
	}
}


public class MassageTest{
	public static void main(String[]args){
		Massage ma=new Massage("你今天有什么计划吗?");
		Massage me=new Massage(98.3);
		ma.sentMassage();
		me.sentMassage();
		//String str=(String)me.getContent();//此处ClassCastException(失误操作)
		//str.split();
		
		
	}
}
output:
你今天有什么计划吗?
98.3
//Exception in thread "main" java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String
        at MassageTest.main(MassageTest.java:25)

该程序用Object类作为所以类的父类进行接收所以的类型的数据,可以实现相应的功能,没有一点问题

但一般我们得到相应的数据之后,一般会做相应的一些处理,如程序中的注释部分,其中一般会涉及向下转型(用于调用子类特有的方法)向下转型如果我们操作失误,将可能会发生ClassCastException异常更重要的是这种异常为运行时异常,在编译期间不会暴露,而在我们的运行期间才会暴露,这给我们的程序带来了极大的安全隐患

而泛型的使用可以从根源上解决这个问题

为了解决这个问题,我们可以将这个Massage类设计成泛型类 由此我们引入泛型类

泛型类

泛型类在进行对象的实例化的时候,指定该泛型类所携带的泛型的具体类型
格式:
类名称<具体类> 对象名称= new 类名称<具体类>();
在jdk1.7时对该格式进行了简化:
类名称<具体类> 对象名称= new 类名称<>();(好像也称为钻石表达式)

泛型类实现后面同样的代码

//用于接收不同类型的消息
class Massage<T>{//标识为一个泛型类,T该泛型的类型
	private T content;//此处类型由外部指定
	public Massage(T content){//由外部指定
		setContent(content);
	}
	public T getContent(){//由外部指定
		return content;
	}
	public void setContent(T content){//由外部指定
		this.content=content;
	}
	public void sentMassage(){
		System.out.println(content);
	}
}


public class MassageTest{
	public static void main(String[]args){
		Massage<String>ma=new Massage<String>("你今天有什么计划吗?");
		Massage<Double>me=new Massage<Double>(98.3);
		ma.sentMassage();
		me.sentMassage();
	    String str=me.getContent();//此处失误
		str.split("");
		
		
	}
}
编译后:
MassageTest.java:25: 错误: 不兼容的类型: Double无法转换为String
            String str=me.getContent();//此处失误
                                    ^

相信聪明的你已经发现不同了,用泛型类进行实现相同的功能,和普通类实现相比更安全,都是相同的错误,但泛型实现在编译期间就可以泛型,而普通类进行实现需要在运行期间才能够发现(如果开发要求比较严格,这种有警告信息的代码一般不允许发布)

注意:

  • 泛型的类型只能用类,基本数据类型需要使用对应的包装类,有自动拆箱和装箱的加持࿰
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值