最终铸造概念不适用于超载

时间:2015-05-21 08:40:33

标签: java casting overloading

在我的铸造课上,老师教给我们一个有趣的事实如下。

Entrust::routeNeedsRole('admin/*', 'owner',dd(
    "Access Denied!"
));

我们收到了错误

class Casting {
    public static void main(String args[]){
        int i = 10;
        byte b = i;
        System.out.println(b);
    }
}

然后我们更改了代码如下

java:5: possible loss of precision

我们得到了正确的输出。至于原因,他告诉我们当修改变量class Casting1 { public static void main(String args[]){ final int i = 10; byte b = i; System.out.println(10); } } 10 时,变量存储在可能的最小数据类型中。在这种情况下是final。这就是我们能够在不使用cast关键字的情况下进行转换的原因。

但是当我们像这样使用方法重载时,

byte

我得到输出class A { void m(int i){ System.out.println("int"); } void m(byte b){ System.out.println("byte"); } public static void main(String args[]){ A a1 = new A(); final int i = 10; a1.m(i); } } 。如果最终变量存储在尽可能低的数据类型中,则它应为int。所以我尝试了下面的代码,没有重载。

byte

这是什么原因?我有什么不明白的地方吗?

4 个答案:

答案 0 :(得分:2)

您正在混淆变量的内存空间及其类型。 调用方法m(...)首先检查参数变量的类型。这里是一个int,所以它将选择相应的重载方法,无论内存中int的大小。

虽然我真的很赞赏你的第一个例子,它将光线带入了最终标识符的一个特征。

答案 1 :(得分:2)

这一点并不正确......

"至于原因,他告诉我们当我们修改变量final时,变量会以尽可能小的数据类型存储。在这种情况下是一个字节。"

它没有将它存储为一个字节,它将它存储为一个int,但它实际上是一个常量,因此当Java编译行byte b = i;时,它确定该值将为10,这不是& #39; t需要施法。

答案 2 :(得分:0)

  

我有什么不明白的地方吗?

是。搜索应用哪种方法取决于参数的类型。与分配的情况不同,方法参数没有转换尝试(至少,在将自动装箱添加到语言之前没有,这增加了另一组任意规则)。

答案 3 :(得分:0)

如果转换是作业的一部分,并且该值可以放入byte,则编译器会自动为您执行转换。

JLS清楚地解释了这种情况仅适用于赋值,而不适用于其他情境中的转化。

值得一提的是,byte仅在为嵌入式设备编程或处理文件/网络时才有用。 <{1}}和byte占用相同的空间,因为变量地址是对齐的。