一 、问题引出
设计一个表示坐标点的类,坐标的表示方法有以下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) ;
}
};
编译通过,执行时出现类转换异常