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用的是括号括起来的。不知道这种写法的含义!!!有哪位帮我解释下,不胜感谢!!!

解决方案 »

  1.   

    你的getX(),getY()返回的都是Object类型
    Object没有拆箱操作,要转变成Float类型才可以
      

  2.   

    那为啥float y = (Float)p.getY() ;用括号呢,就是这个不解,不好意思,我还是初学者,所以问题可能问得较笨
      

  3.   

    getX出来的是Object,Object自然是需要先要转成Float了。以下两种都是正确的:float x = (Float)p.getX() ;
    Float x1 = (Float)p.getX();
      

  4.   

    那是强制转换的 编译期会检查类型的 下面这种转换就会报编译错误的:String str = "java";int i = (Integer)str; //报错int i = 100;long l = (long)i; //正确
      

  5.   

     float x = (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()语句。
      

  6.   

    感谢9楼,我现在明白了,特贴出我理解并分解的代码!!!!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 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) ;
        }
    };
      

  7.   


    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; //错