问题 为什么这里不需要明确的演员?


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 如果是byte类型,则此代码将生成编译时错误。 (可以通过对参数使用显式字节转换来避免: 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; )

谢谢。


6190
2017-12-17 13:31


起源



答案:


在这种情况下,Java支持缩小范围。来自 Java语言规范 上 作业转换

如果类型的话,可以使用缩小的基元转换   变量是 byteshort, 要么 char,以及常量的值   表达式可以在变量的类型中表示。


11
2017-12-17 13:38



我认为这是正确的答案,所以+1。 moonwave99的答案不正确。 - Juvanis
@McDowell但是为什么传递时不应用这种缩小的原始转换 int 字面值12作为期望a的参数 byte 论据? - jlordo
@jlordo - 此规则适用于变量赋值。将文字作为参数传递时,语言规范不需要缩小范围。 至于为什么说明书有这个限制,你必须问问James Gosling。 我澄清了我的答案。 - McDowell
谢谢麦克道尔。感谢您关于“缩小”的链接。我以前从未听说过。 +1。 - PrashanD


答案:


在这种情况下,Java支持缩小范围。来自 Java语言规范 上 作业转换

如果类型的话,可以使用缩小的基元转换   变量是 byteshort, 要么 char,以及常量的值   表达式可以在变量的类型中表示。


11
2017-12-17 13:38



我认为这是正确的答案,所以+1。 moonwave99的答案不正确。 - Juvanis
@McDowell但是为什么传递时不应用这种缩小的原始转换 int 字面值12作为期望a的参数 byte 论据? - jlordo
@jlordo - 此规则适用于变量赋值。将文字作为参数传递时,语言规范不需要缩小范围。 至于为什么说明书有这个限制,你必须问问James Gosling。 我澄清了我的答案。 - McDowell
谢谢麦克道尔。感谢您关于“缩小”的链接。我以前从未听说过。 +1。 - PrashanD


Java原始数据类型参考

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

尝试返回128 :))


2
2017-12-17 13:34



我已经有,但我的观点是返回介于-127到+128之间的值应该产生错误。 - PrashanD
@ moonwave99所以有隐式转换,因为该方法的返回类型是字节?如果是这样,为什么这也不适用于在OPs第一个代码示例中传递参数? - jlordo
一个 byte是一个“受限制的” int,[例如喜欢 short]。根本不需要提出错误。 - moonwave99
jlordo明白了我的观点。引用:为什么这也不适用于OPs第一个代码示例中的参数传递? - PrashanD
@Prashan现在我对这个问题有了更好的线索 - 我实际上并不知道Java在这个意义上做了什么,行为似乎不一致。 - moonwave99


这会奏效 byte b = 4 只要值在范围内,但如果你尝试类似的东西 byte b = 2000 你会得到编译器错误,因为它超出了范围。 12 在范围内,所以你不会得到错误。


0
2017-12-17 13:35



但是12是一个int文字,我试图返回一个int文字。它是否在字节范围内并不重要。这就是第一个代码片段产生错误的原因。 - PrashanD