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

Sha*_*eep 12 java casting overloading

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

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

我们收到了一个错误

java:5: possible loss of precision
Run Code Online (Sandbox Code Playgroud)

然后我们更改了代码如下

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

10
Run Code Online (Sandbox Code Playgroud)

我们得到了正确的输出.至于原因,他告诉我们当我们修改变量时final,变量可以存储在最小的数据类型中.在这种情况下是一个byte.这就是我们能够在不使用cast关键字的情况下进行转换的原因.

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到了输出int.如果最终变量存储在尽可能低的数据类型中,则应该是byte.所以我尝试了下面的代码,没有重载.

class A {
    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);
    }
}

java:9: m(byte) in A cannot be applied to (int)
Run Code Online (Sandbox Code Playgroud)

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

小智 2

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

尽管我真的很欣赏你的第一个例子,它让我们了解了最终标识符的一个特征。