上一篇:危险的转型操作 | 带你学《Java面向对象编程》之六十三
【本节目标】
通过阅读本节内容,你将接触到泛型的概念,了解其规避转型风险的原理,学会定义一个简单的泛型类并能够正确地实例化泛型类。
泛型定义
如果要想避免项目之中出现“ClassCastException”最好的做法是可以直接回避掉对象的强制转换,所以在JDK1.5之后提供有泛型技术,而泛型的本质在于,类中的属性或方法的参数与返回值的类型可以由对象实例化的时候动态决定。
那么此时就需要在类定义的时候明确定义占位符(泛型标记)。
class Point <T> { //T是Type的简写,可以定义多个泛型
private T x ;
private T y ;
public void setX(T x) {
this.x = x ;
}
public void setY(T y) {
this.y = y ;
}
public T getX() {
return this.x ;
}
public T getY() {
return this.y ;
}
}
public class JavaDemo {
public static void main(String args[]) {
Point point = new Point() ;
//第一步:根据需求进行内容的设置
point.setX(10) ; //自动装箱
point.setY(“北纬20度”) ; //自动装箱
//第二步:从里面获取数据
int x = (Integer) point.getX() ;
int y = (Integer) point.getY() ;
System.out.println(“x坐标:” + x + “、y坐标:” + y) ;
}
}
此时Point中的x与y属性的数据类型并不确定,而是由外部来决定。
提示:关于默认的泛型类型
- 由于泛型是属于JDK1.5之后的产物,但是在这之前已经有不少程序类或者接口广泛的应用在项目开发之中,于是为了保证这些类或接口追加了泛型之后,原始的程序类依然可以使用,所以如果不设置泛型类型时,自动将使用Object作为类型,以保证程序的正常执行,但是在编译的过程之中会出现警告信息。
泛型定义完成后可以在实例化对象的时候进行泛型类型的设置,一旦设置之后,里面的x与y的属性的类型就与当前对象直接绑定了。
class Point <T> { //T是Type的简写,可以定义多个泛型
private T x ;
private T y ;
public void setX(Integer x) {
this.x = x ;
}
public void setY(Integer y) {
this.y = y ;
}
public T getX() {
return this.x ;
}
public T getY() {
return this.y ;
}
}
public class JavaDemo {
public static void main(String args[]) {
Point<Integer> point = new Point<Integer>() ;
//第一步:根据需求进行内容的设置
point.setX(10) ; //自动装箱
point.setY(20) ; //自动装箱
//第二步:从里面获取数据
int x = point.getX() ;
int y = point.getY() ;
System.out.println(“x坐标:” + x + “、y坐标:” + y) ;
} //执行结果:x坐标:10、y坐标:20
}
现在的程序代码之中,由于Point类里面设置的泛型类型为Integer,这样所有的对应此泛型的属性、变量、方法返回值全部替换为Integer(只局限于此对象之中),这样在进行处理的时候如果发现设置的内容有错误,则会在程序编译的时候自动进行错误提示,同时也避免了对象的向下转型处理(可以避免安全隐患)。
Point<String> pointB = new Point<String>() ;
泛型的使用注意点:
- 泛型之中只允许设置引用类型,如果现在要操作基本类型必须使用包装类;
从JDK1.7开始,泛型对象实例化可以简化为“Point point = new Point<>()”;
使用泛型可以解决大部分的类对象的强制转换处理,这样的程序才是一个合理的设计。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学