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.6f) ; // 利用自动装箱操作: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) ;
}
};
关于以上代码,我想请教一下大虾们,为什么自动拆箱要用(Float)p.getY() ; 书上写的是 Float x= 就自动拆箱了,可这里的Float用的是括号括起来的。不知道这种写法的含义!!!有哪位帮我解释下,不胜感谢!!!
Object没有拆箱操作,要转变成Float类型才可以
Float x1 = (Float)p.getX();
(1) 强制类型转化: Float f=(Float)p.getX(); 这一句是将Object型强制向下转型成Float。至于为什么能够成功转化,是因为p.setX(10.5f)语句将Point类中的引用x指向了Float实际对象。(2) 包装器自动拆包: float x=f;
每一种基本数据类型都有自己对应的包装器,并且编译器有自动打包、拆包功能。也就是说编译器会将上面的语句编译成: float x=f.floatValue()语句。
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.6f) ; // 利用自动装箱操作:float --> Float --> Object Float f1=(Float)p.getX() //p.getX返回的是Object类,因此产生向下转型
Float f2=(Float)p.getY() //p.getX返回的是Object类,因此产生向下转型
float y = f1;
float y = f2;
System.out.println("小数表示,X坐标为:" + x) ;
System.out.println("小数表示,Y坐标为:" + y) ;
}
};
LZ 你的注解这句有点问题:p.getX返回的是Object类,因此产生向下转型关于强制向下转型可见我的博客《java类型间的转换》。不是说返回的是Object类,任何类都继承Object,所有Object可以向下强制转型成任何类。
一定要多态情况下,才能强制向下转型
Object o=new Float(1);
Float f=(Float)o; //对
下面这种情况强制转型会包报异常
Object o=new Object();
Float f=(Float)o; //错