根据我在Java中的知识,在缩小类型转换时,如果允许源在字节范围内的任何常量中进行转换,则允许这样做:
byte b=10; // allowed because 10 is in range of byte and 10 is a constant但当我打字时:
byte b=10l; // this is not allowed although 10 is in range of byte and is a constant 为什么会这样?您能告诉我们在Java中进行这些收缩转换的确切规则吗?
发布于 2014-05-30 07:33:12
技术上的答案是-因为规格说明是这样说的。, Java SE 8 Edition的部分声明是:
此外,如果赋值语句右侧的表达式是
byte、short、char或int类型的常量表达式(第15.28节):
byte、short或char,并且常量表达式的值可以在变量的类型中表示,则可以使用收缩原语转换。至于为什么它不允许常量表达式为long类型,我想这是因为您从来没有“意外地”以long类型结束。编写byte b = 127作为byte b = (byte) 127的简写非常方便,而编译器可以防止您错误地将byte b = 128作为byte b = (byte) 128的缩写;具体而言,能够编写byte b = 127L并不那么有用,因为您为什么需要这样做呢?
发布于 2014-05-30 07:28:50
http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.2
此外,如果表达式是字节、短、字符或int类型的常量表达式(§15.28):
您有一个long类型的常量表达式,在这种情况下不能应用收缩原语转换。
所以你可以:
byte b = 10byte b = (int) 10char b = (short) 10byte b = (char) 10Lshort b = (int) 10L但你不能:
byte b = 10Lbyte b = (long) 10发布于 2014-05-30 07:23:00
因为您附加到值的l显式地告诉编译器-“听着,兄弟,我这里有一个'long‘字段,给它一个'long’字段所需的空间。”
很明显,长值不能适用于字节字段。所以,您得到了错误- Cannot Convert from Long to Byte
https://stackoverflow.com/questions/23949132
复制相似问题