例如,我有这样一个类:
public class Col {
static void test(int a)
{
System.out.println("int");
}
public static void main(String args[])
{
Col.test(12); //1
Col.test((byte)12); //2
Col.test((long)100); //3
}
}现在我来看看algoritm是如何运行这段代码的。我认为,这一步:
1行-所有正确的调用方法与int参数,完美。
2带有字节param...oooops的线路调用方法。做什么?Java尝试将字节加宽为int?是真的吗?
带有长参数的3行调用方法...又来了。做什么?不能将long转换为int java,因为会损失准确性。试试看?和在结果异常中。
然后我再加一句:
public static void test(Object a)
{
System.out.println("Object");
}如果有一个电话:
Col.test((long)100);都是正确的,没有例外,那么,原语类型long和Object之间的关系是什么?
发布于 2010-12-08 15:32:31
是的,存在从byte到int的隐式转换,但没有从long到int的隐式转换(因为可能会丢失信息)。
在第三种情况下,您使用的是自动装箱,它会将long (原语类型)转换为Long (类类型)。
您可以通过将test的主体更改为:
public static void test(Object a)
{
System.out.println(a.getClass());
}然后它将打印出class java.lang.Long。
发布于 2010-12-08 15:39:49
您的第一个示例显示了原始类型的转换。第二个示例显示了装箱和拆箱,简而言之,这是原始类型(如long)和它们的包装类(本例中为java.lang.Long)之间的方便转换。
重载是实现名称相同但参数不同的方法。这里我们有两个方法
static void test(int a){}
static void test(Object a){}并使用test((long) 100)调用它。第一个方法不能被调用,因为如果没有显式类型转换,JVM不会将long限制为int。但是JVM (版本1.5+)可以将long值转换为Long (自动装箱),而test(Long.valueOf((long) 100))是第二种方法的最佳匹配。
发布于 2010-12-08 15:47:26
这是因为自动装箱功能。实际上,您已经将原语提升为long,并且在自动调用测试方法时,它正在搜索其等效类型,因此它调用的是test(Object A),.You可以看到类似这样的Col.test(new Integer(12));这也将调用test(Object a).Also您可以引用此链接Determining if an Object is of primitive type
https://stackoverflow.com/questions/4385136
复制相似问题