在我的铸造课上,老师教给我们一个有趣的事实如下。
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
这是什么原因?我有什么不明白的地方吗?
答案 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
占用相同的空间,因为变量地址是对齐的。