【问题标题】:final casting concept doesn't apply for overloading最终铸造概念不适用于重载
【发布时间】:2015-05-21 08:40:32
【问题描述】:

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

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 时,该变量会以尽可能小的数据类型存储。在这种情况下是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);
    }
}

我得到了输出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)

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

【问题讨论】:

  • 在带有 final 的示例中,您将常量 10 传递给 println。可能应该是b。你应该检查你的代码中是否存在这个错字,也许它会改变结果?
  • 第一个示例给了我一个编译错误:类型不匹配:无法从 int 转换为字节。第二个例子(最终)通过编译
  • @sharonbn 是的,它应该是这样的。我已经提到我收到一个错误

标签: java casting overloading


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这一点不太正确...

    “至于原因,他告诉我们,当我们修改一个变量 final 时,该变量被存储在可能的最小数据类型中。在这种情况下是一个字节。”

    它不;不将其存储为字节,而是将其存储为 int,但它实际上是一个常量,因此当 Java 编译 byte b = i; 行时,它肯定知道该值将是 10,这不会需要铸造。

    【讨论】:

    • @Phil,在您的回答中,您提到“最终变量不需要强制转换”。你能澄清一下这个说法吗?
    • @Anil:当然!并不是最终变量本身不需要强制转换。只是 Java 编译器可以有效地将它们视为常量,因为它知道它们永远不会改变。所以... byte b = i 与不需要强制转换的 byte b = 10 相同。这是否有助于使其更清晰?
    • @Phil,是的,我明白了。谢谢
    【解决方案3】:

    我有什么误解吗?

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

    【讨论】:

      【解决方案4】:

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

      JLS 清楚地解释了这是一种仅适用于 assignment 而不适用于其他上下文中的转换的特殊情况。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        相关资源
        最近更新 更多