首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中的缩小类型转换究竟是什么?

java中的缩小类型转换究竟是什么?
EN

Stack Overflow用户
提问于 2014-05-30 07:19:27
回答 5查看 2.1K关注 0票数 2

根据我在Java中的知识,在缩小类型转换时,如果允许源在字节范围内的任何常量中进行转换,则允许这样做:

代码语言:javascript
复制
byte b=10; // allowed because 10 is in range of byte and 10 is a constant

但当我打字时:

代码语言:javascript
复制
byte b=10l; // this is not allowed although 10 is in range of byte and is a constant 

为什么会这样?您能告诉我们在Java中进行这些收缩转换的确切规则吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-05-30 07:33:12

技术上的答案是-因为规格说明是这样说的。, Java SE 8 Edition的部分声明是:

此外,如果赋值语句右侧的表达式是byteshortcharint类型的常量表达式(第15.28节):

  • 如果变量的类型是byteshortchar,并且常量表达式的值可以在变量的类型中表示,则可以使用收缩原语转换。

至于为什么它不允许常量表达式为long类型,我想这是因为您从来没有“意外地”以long类型结束。编写byte b = 127作为byte b = (byte) 127的简写非常方便,而编译器可以防止您错误地将byte b = 128作为byte b = (byte) 128的缩写;具体而言,能够编写byte b = 127L并不那么有用,因为您为什么需要这样做呢?

票数 2
EN

Stack Overflow用户

发布于 2014-05-30 07:28:50

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.2

此外,如果表达式是字节、短、字符或int类型的常量表达式(§15.28):

  • 如果变量的类型是字节、简短或char,并且常量表达式的值可以在变量的类型中表示,则可以使用收缩原语转换。

您有一个long类型的常量表达式,在这种情况下不能应用收缩原语转换。

所以你可以:

  • byte b = 10
  • byte b = (int) 10
  • char b = (short) 10
  • byte b = (char) 10L
  • short b = (int) 10L

但你不能:

  • byte b = 10L
  • byte b = (long) 10
票数 3
EN

Stack Overflow用户

发布于 2014-05-30 07:23:00

因为您附加到值的l显式地告诉编译器-“听着,兄弟,我这里有一个'long‘字段,给它一个'long’字段所需的空间。”

很明显,长值不能适用于字节字段。所以,您得到了错误- Cannot Convert from Long to Byte

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23949132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档