泛型
摘要
泛型是JDK1.5版本后出现的新技术特性,利用泛型的特性可以方便地避免对象强制转型所带来的安全隐患问题(ClassCastException)。
为何这样说,有什么问题?
下面我将给出具体实例来说明问题。
下面通过模拟记录地址的经纬度,来演示。
记录经纬度的”实体类“
/**
* 记录坐标经纬度
* 用于测试Object转型的安全问题
*/
public class Point {
private Object x;
private Object y;
public Object getX() {
return x;
}
public void setX(Object x) {
this.x = x;
}
public Object getY() {
return y;
}
public void setY(Object y) {
this.y = y;
}
}
来看这段代码
案例1:
/**
* 案例1
*/
Point pointNormal = new Point();
pointNormal.setX(1);
pointNormal.setY(2);
int x = (Integer)pointNormal.getX();
int y = (Integer)pointNormal.getY();
/**
*这里打印一下对应的值
*/
System.out.println("X:"+x+"\nY:"+y);
案例2:
/**
* 案例2
*/
Point pointException = new Point();
pointException.setX(1);
pointException.setY("北纬2度");
int x = (Integer)pointNormal.getX();
int y = (Integer)pointNormal.getY();
/** * 问题出现了,转换类型报错ClassCastException */ System.out.println("X:"+x+"\nY:"+y);
具体报错内容:![类型转换异常(ClassCastException)](https://img-blog.csdnimg.cn/direct/f28f8820bf4844c1a759b056cb708a8c.png#pic_center)
泛型快速入门
那么该如何解决,“泛型”就登场了
替换为泛型的”实体类“
public class GE_Point<T> {
private T x;
private T y;
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
public T getY() {
return y;
}
public void setY(T y) {
this.y = y;
}
}
指定泛型为Integer
GE_Point<Integer> gePoint = new GE_Point<>();
gePoint.setX(1);
gePoint.setY("北纬2度");
/**
* 实例化对象时,类型已经被声明了
* 由于泛型再声明对象的时候已经指定了类型,
* 所以这里就不用继续转换类型,也不会报错
*/
System.out.println("X:"+pointNormal.getX()+"\nY:"+pointNormal.getY());
但是这里在编译时就已经报错了
报错信息:‘one.entity.GE_Point’ 中的 ‘setY(java.lang.Integer)’ 无法应用于 ‘(java.lang.String)’
总结
所以不难看出,泛型避免了强制类型转换而带来的“类型转换异常”,同时如果已经声明了类型,然后再赋值时赋予与其不一样的类型值的时候仅在编译时就会报错,提升了代码的“安全性”。
说在最后
其实泛型也存在一些问题以及一些解决方案,这就涉及到泛型通配符的知识,我将尽快发布后面的内容,谢谢各位看客老爷赏脸。