为了解决程序中的ClassCastException异常,最稳妥的方法就是避免进行强制向下转型。而泛型技术的优点在于将类中的成员变量、函数的参数以及返回值变成动态标记,在实例化对象的时候动态地规定使用的数据类型。
泛型的定义:
class Dimen<T>{
private T x;//向量的x坐标
private T y;//向量的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;
}
}
这段代码是上篇文章中的所有的Object被替换成T得来的,在类的后面使用来进行泛型的定义。
public class DimenTest{
public static void main(String[]args){
Dimen dimen = new Dimen();
dimen.setX(5);
dimen.setY(7);
int x = dimen.getX();
int y = dimen.getY();
System.out.println("该向量为:" + x + "i" + "+" + y + "j");
}
}
如果在对象实例化的时候不给泛型规定一个类型,便会出现下面这种错误。
会直接报错无法编译,提示说明Object无法转换为int。这是因为如果在对象实例化时,如果我们不给泛型一个类型,系统会默认给予泛型一个Object类型,与下面的代码是等价的:
class Dimen<Object>{
private Object x;//向量的x坐标
private Object y;//向量的y坐标
public void setX(Object x){
this.x = x;
}
public void setY(Object y){
this.y = y;
}
public Object getX(){
return this.x;
}
public Object getY(){
return this.y;
}
}
但是如果我们在对象实例化的时候规定一下泛型的类型,例如:
Dimen<Integer> dimen = new Dimen<Integer>();
这行代码就直接规定了泛型的类型,相当于将Dimen类中的所有的T全部换成Integer,等价于如下代码:
class Dimen<Integer>{
private Integer x;//向量的x坐标
private Integer y;//向量的y坐标
public void setX(Integer x){
this.x = x;
}
public void setY(Integer y){
this.y = y;
}
public Integer getX(){
return this.x;
}
public Integer getY(){
return this.y;
}
}
完整代码为:
class Dimen<T>{
private T x;//向量的x坐标
private T y;//向量的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 DimenTest{
public static void main(String[]args){
Dimen<Integer> dimen = new Dimen<Integer>();
//给成员变量赋值
dimen.setX(5);
dimen.setY(7);
//获取成员变量,由于getger的返回值类型是Object,所以需要使用向下转型
int x = dimen.getX();
int y = dimen.getY();
System.out.println("该向量为:" + x + "i" + "+" + y + "j");
}
}
其运行结果如下:
在编译和运行的过程中没有任何的警告或异常。但是如果将setter里面传入的数字改成Double型,则编译直接不通过,如:
dimen.setY(1.5);
其编译结果为: