泛型的定义(1)

为了解决程序中的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);

其编译结果为:
在这里插入图片描述

发布了15 篇原创文章 · 获赞 5 · 访问量 701

猜你喜欢

转载自blog.csdn.net/weixin_46192593/article/details/104789085