首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要了解核心java中的Boxing

需要了解核心java中的Boxing
EN

Stack Overflow用户
提问于 2012-07-14 14:48:48
回答 4查看 125关注 0票数 0

我不明白在下面的例子中,int7是如何被认为是对象的。

sifer(7)被认为是方法sifer(对象o)。我不能理解这是怎么发生的。在我的一本java参考书中,它说Int可以被装箱到一个Integer,然后“加宽”到一个object。我不确定这是什么意思。

代码语言:javascript
复制
 >> Class A 
class A { }     

 >> Class B 

class B extends A { }   
 >> Class ComingThru  

public class ComingThru {  
   static String s ="-";    
static void sifer(A[] ...a2)  
{  
    s = s + "1";  
}

static void sifer(B[] b1)  
{
    s += "3";  
}
static void sifer(Object o)   
{
    s += "4";  
}      

   public static void main(String[] args)   {
        // TODO Auto-generated method stub

    A[] aa= new A[2];  
    B[] ba = new B[2];  

    //sifer(aa);  
    //sifer(ba);  
    sifer(7);
    System.out.println(s);  


}  

}

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-14 14:54:04

由于没有sifer(int)方法,编译器将尝试查找“最接近的匹配”。在本例中,其他两个sifer方法将数组作为参数,而int显然不是。

最后一种方法,sifer(Object)可以应用于任何对象,包括Integer,因此这就是用于sifer(7)的方法。

reality is a little more complex和JVM将按以下顺序查找匹配方法:

  • a identity conversion
    • 在您的情况下是:sifer(int),但没有这样的method

例如,

  • 一个扩展原语转换
    • ,例如:sifer(long),但没有这样的method

不适用,object不是

    • 在你的情况下: not applicable,int不是int

整数是装箱转换(可选),后面是扩大引用转换,在您的情况下,这就是发生的事情:被装箱为

  • ,被扩大为

在您的例子中,

  • 是一个取消装箱的转换,后面跟着一个扩展的原语转换:

票数 3
EN

Stack Overflow用户

发布于 2012-07-14 15:10:14

1.上面的代码提供了一个经典的方法重载的例子,以及AutoBoxing和Java1.5带来的自动拆箱,导致手动装箱和拆箱是一件痛苦的事情。

2. The sifer(A[]... a2)sifer(B[] b1)都在其参数中接受数组类型的实参,该实参不可能与匹配。所以现在我们只剩下sifer(Object o)了。

3.现在int将自动转换为Wrapper Object Integer

你可以通过snifer(Object o)方法来验证它。

代码语言:javascript
复制
    o.getClass().getName();

有关详细信息,请参阅此链接:

http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

票数 1
EN

Stack Overflow用户

发布于 2012-07-14 14:50:50

7将通过auto boxed连接到作为ObjectInteger

还请参阅

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11481689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档