为什么要使用泛型

一 、问题引出

设计一个表示坐标点的类,坐标的表示方法有以下3种 :

  • 整数表示:x = 10, y = 20
  • 小数表示:x = 10.5 , y = 20.5
  • 字符串表示: x = “东经180度” ,y = “北纬220度”

分析此要求:

1 、建立一个表示坐标点的类 Point
2 、此类有两个属性分别表示 X坐标 和 Y坐标
3 、属性 x 和 y 中所保存的数据类型有3种(int 、float 、String)


思路:
Object 类可以接收任何类型的数据,都会自动发生向上转型操作

实现:
1 、整数表示 :

class Point{
	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 ;
	}
};

public class GenericsDemo01{
	public static void main(String args[]){
		Point p = new Point() ;	// 声明一个Point的对象
		p.setX(10) ;		// 利用自动装箱操作:int --> Integer --> Object
		p.setY(20) ;		// 利用自动装箱操作:int --> Integer --> Object
		int x = (Integer)p.getX() ;	// 取出数据先变为Integer,之后自动拆箱
		int y = (Integer)p.getY() ;	// 取出数据先变为Integer,之后自动拆箱
		System.out.println("整数表示,X坐标为:" + x) ;
		System.out.println("整数表示,Y坐标为:" + y) ;
	}
};

程序运行结果:
在这里插入图片描述

2 、小数表示:

class Point{
	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 ;
	}
};

public class GenericsDemo02{
	public static void main(String args[]){
		Point p = new Point() ;	// 声明一个Point的对象
		p.setX(10.5f) ;		// 利用自动装箱操作:float --> Float --> Object
		p.setY(20.5f) ;		// 利用自动装箱操作:float --> Float --> Object
		float x = (Float)p.getX() ;	// 取出数据先变为Integer,之后自动拆箱
		float y = (Float)p.getY() ;	// 取出数据先变为Integer,之后自动拆箱
		System.out.println("小数表示,X坐标为:" + x) ;
		System.out.println("小数表示,Y坐标为:" + y) ;
	}
};

程序运行结果:
在这里插入图片描述


3 、字符串表示:

class Point{
	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 ;
	}
};

public class GenericsDemo03{
	public static void main(String args[]){
		Point p = new Point() ;	// 声明一个Point的对象
		p.setX("东经180度") ;		// String --> Object
		p.setY("北纬220度") ;		// String --> Object
		String x = (String)p.getX() ;	// 取出数据先变为Integer,之后自动拆箱
		String y = (String)p.getY() ;	// 取出数据先变为Integer,之后自动拆箱
		System.out.println("字符串表示,X坐标为:" + x) ;
		System.out.println("字符串表示,Y坐标为:" + y) ;
	}
};

程序运行结果:
在这里插入图片描述
以上3个程序实现了所要求的功能,那么以上的实现是否存在问题呢?
观察以下程序:

class Point{
	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 ;
	}
};

public class GenericsDemo04{
	public static void main(String args[]){
		Point p = new Point() ;	// 声明一个Point的对象
		p.setX(10) ;			// 利用自动装箱操作:int --> Integer --> Object
		p.setY("北纬210度") ;		// String --> Object
		int x = (Integer)p.getX() ;	// 取出数据先变为Integer,之后自动拆箱
		int y = (Integer)p.getY() ;	// 此处出现类转换异常错误
		System.out.println("整数表示,X坐标为:" + x) ;
		System.out.println("整数表示,Y坐标为:" + y) ;
	}
};

编译通过,执行时出现类转换异常
在这里插入图片描述

设置的String 类型无法向 Integer 类型转换,造成了数据安全问题,而要解决以上问题就可以使用泛型技术

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值