-
泛型概述
-
泛型使用的必要性
-
泛型类
-
泛型接口
-
泛型对象引用传递的解决方案
-
泛型方法
-
泛型的简单应用
—本文中将介绍泛型的基础知识以及简单应用,后面还计划学泛型的擦除机制以及在集合和反射机制中的应用
泛型的概述
泛型,字面上理解就是广泛的数据类型。其实就是将数据类型进行参数化,可以达到进一步的代码复用和使得程序更安全的目的
- 泛型的基本定义
泛型的特点:在声明一个变量或者属性的时候不设置其数据类型,而是在指定结构使用的时候进行动态的配置。使用泛型解决了强制类型转化的设计缺陷
泛型的必要性
在生活中信息的发送是并不可少的,但信息表达的方式也是不尽相同的。怎样实现代码复用得接收不同类型的消息显得很重要
不使用泛型的设计
//用于接收不同类型的消息
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();//此处失误
^
相信聪明的你已经发现不同了,用泛型类进行实现相同的功能,和普通类实现相比更安全,都是相同的错误,但泛型实现在编译期间就可以泛型,而普通类进行实现需要在运行期间才能够发现(如果开发要求比较严格,这种有警告信息的代码一般不允许发布)
注意:
- 泛型的类型只能用类,基本数据类型需要使用对应的包装类,有自动拆箱和装箱的加持