【问题标题】:Why is an explicit cast not needed here?为什么这里不需要显式转换?
【发布时间】:2012-12-17 13:31:38
【问题描述】:
class MyClass {
    void myMethod(byte b) {
        System.out.print("myMethod1");
    }

    public static void main(String [] args) {
        MyClass me = new MyClass();
        me.myMethod(12);
    }
}

我了解myMethod() 的参数是int 文字,而参数b 是字节类型,此代码会生成编译时错误。 (可以通过对参数使用显式字节转换来避免:myMethod((byte)12)

class MyClass{
    byte myMethod() {
        return 12;
    }

    public static void main(String [ ] args) {
        MyClass me = new MyClass();
        me.myMethod();
    }
}

在经历了这个之后,我预计上面的代码也会产生编译时错误,考虑到 12 是 int 字面量,myMethod() 的返回类型是字节。但是不会发生这样的错误。 (不需要显式转换:return (byte)12;

谢谢。

【问题讨论】:

    标签: java methods casting return-type


    【解决方案1】:

    Java 在这种情况下支持缩小范围。来自Java Language Spec 作业转换

    如果类型为 变量为byteshortchar,常量的值 表达式可以用变量的类型来表示。

    【讨论】:

    • 我认为这是正确的答案,所以 +1。 moonwave99 的回答不正确。
    • @McDowell 但为什么在将 int 文字 12 作为期望 byte 参数的参数传递时不应用这种缩小原始转换?
    • @jlordo - 此规则适用于变量赋值。将文字作为参数传递时,语言规范不需要缩小范围。 至于规范为什么有这个限制,你得问问 James Gosling。我已经澄清了我的答案。
    • 谢谢麦克道尔。感谢您提供“缩小范围”的链接。我以前从未听说过。 +1。
    【解决方案2】:

    来自Java Primitive Data Type reference

    byte:byte 数据类型是一个 8 位有符号二进制补码整数。最小值为-128,最大值为127(含)。

    尝试返回 128 :))

    【讨论】:

    • 我已经有了,但我的意思是返回一个介于 -127 到 +128 之间的值应该产生错误。
    • @moonwave99 那么是否存在隐式转换,因为方法的返回类型是字节?如果是这样,为什么这也不适用于 OPs 第一个代码示例中的参数传递?
    • A byte是一个“受约束的”int,[例如像short]。根本不需要引发错误。
    • jlordo 明白了我的意思。 QUOTE:为什么这也不适用于 OPs 第一个代码示例中的参数传递?
    • @Prashan 现在我对这个问题有了更好的线索 - 我实际上不知道 Java 在这个意义上做了什么,行为似乎不一致。
    【解决方案3】:

    只要值在范围内,byte b = 4 就可以工作,但是如果您尝试类似byte b = 2000 的操作,则会出现编译器错误,因为它超出了范围。 12 在范围内,所以不会出错。

    【讨论】:

    • 但是 12 是一个 int 文字,我试图返回一个 int 文字。它是否在字节范围内都没有关系。这就是第一个代码片段产生错误的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多