java - 最终类型转换概念不适用于重载

标签 java casting overloading

在选角课上,老师教了我们一个有趣的事实。

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 关键字的情况下进行转换的原因。

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

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。所以我在没有重载的情况下尝试了以下代码。

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)

这是什么原因?我有什么误解吗?

最佳答案

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

虽然我真的很感谢你第一个将光线带入最终标识符的特征之一的例子。

关于java - 最终类型转换概念不适用于重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30368618/

相关文章:

java - 如何在不使用许多语句的情况下进行 SQL 查询来测试许多通配符 id

java - 单击按钮更新 ListView 行项目

java - 与代理的 HTTPS 连接导致 SSLHandshakeException

C#,将变量转换为 Enum.GetUnderlyingType

java - 方法重载的基本概念是什么

c# - C# 编译器如何区分抽象方法的具体子类实现和抽象基类中的重载?

java - java中的翻转字符

c++ - const_cast<> 在 volatile 上的目的是什么?

c - 访问其他大小的 32 位字数组

c++ - 根据 std::tuple 的大小更改函数的返回类型