当前位置: 首页 > 面试题库 >

Java中的原始转换和赋值

敖永丰
2023-03-14
问题内容

我了解以下错误的原因:

byte a = 3; 
byte b = 8; 
byte c = a + b;  // compile error

它不会编译。表达式始终导致int。因此,我们应该进行显式转换:

byte c = (byte) (a + b);   // valid code

但是 我不明白为什么以下是正确的

byte d = 3 + 8;   // it's valid! why?

因为文字整数(例如3或8)始终隐式为int。而且int-or-smaller表情总是导致int过。谁能解释这是怎么回事?

我唯一能猜到的是编译器将此表达式等同于以下内容:

byte d = 11;

并且不认为这是一个表达式。


问题答案:

这有 少† ,无论是否做3 + 8评估,以11在编译时间,
要与事实的编译器是明确允许隐式窄ints到byte在某些情况下秒。具体地,语言规范明确地允许隐式收缩转换到byte类型的常量表达式int可以容纳在byte在编译时。

JLS的相关部分位于第5.2节:

此外,如果表达式类型的常量表达式(§15.28) ,byteshortcharint

  • 甲基本收缩转换可以用于如果变量的类型是byteshort,或char和常量表达式的值在变量的类型表示的

常量的编译时范围变窄意味着byte theAnswer = 42; 允许使用诸如:的代码
。如果不进行缩小,则整数文字42具有类型这一事实int意味着byte将需要强制转换为:

†:显然,根据规范,需要对常数表达式求值,以查看其是否适合较窄的类型。 但是要注意的一点是,如果没有本规范的这一部分,将不允许编译器进行隐式变窄转换

让我们在这里清楚:

byte a = 3; 
byte b = 8;

允许使用 这些参数 的原因是由于规范的上述部分。也就是说,允许编译器将文字隐式缩小3为a
byte。这不是因为编译器在编译时将常量表达式3求值为其值3



 类似资料:
  • 当对象相加 obj1 + obj2,相减 obj1 - obj2,或者使用 alert(obj) 打印时会发生什么? 在这种情况下,对象会被自动转换为原始值,然后执行操作。 在 类型转换 一章中,我们已经看到了数值,字符串和布尔转换的规则。但是我们没有讲对象的转换规则。现在我们已经掌握了方法(method)和 symbol 的相关知识,可以开始学习对象原始值转换了。 所有的对象在布尔上下文(con

  • 问题内容: 我目前正在尝试从书中学习如何使用泛型。在本章中,它说取一条数据T并将其转换为整数。我正在Eclipse中尝试不同的方法,但是似乎都不允许这样做。您如何执行以下任务: 然后在另一个类中: 我已经尝试使用和其他一些东西,但似乎没有什么能使Java满意。本书坚持要保持方法的通用性,以防使用浮点数或双精度数代替字符串或整数。 编辑:对于其他人可能有类似的问题。从对这个问题的所有评论和被接受的答

  • 问题内容: 我有一个和一帮在里面。我想把它变成一个数组,但是打电话 返回。除了手动遍历每个元素,还有更好的方法将其转换为其他数组吗?我想将数组传递给 即使我尝试将其像强制转换那样也不会接受Object []数组 问题答案: Apache的ArrayUtils具有以下功能(它仍在幕后进行迭代): 它们始终是检查此类事情的好地方。

  • 问题内容: 我试图理解Java中日益缩小的原始转换概念。这是JLS 5.1.3 所说的: 关于原始类型的22种特定转换称为“缩小原始转换”: 短字节或字符 字符到字节或短 从int到byte,short或char 长到字节,短,字符或整数 浮点到字节,short,char,int或long 双精度字节,短整数,字符,整数,长整数或浮点数 由于是隐式转换转换到,我们可以写出下面的代码: 演示 但这是

  • 我正在阅读Java语言的规范,关于赋值的转换,我试图获得基本规则,有些文献让我很困惑。有一些出版物说: 要求加宽基元转换后接装箱转换。这不是允许的转换。我理解编译错误和作业的上下文。但真的是一个扩大的原始转换?我的理解如下:Integer<-Short<-Short<-int我看到Integer和Short之间的加宽。还是我糊涂了?

  • 我有模量 目前,我正在提取完整的260个字节(指数为4个字节,模数为256个字节)并编码为base 64。我使用以下shell命令这样做: 这给我以下字符串: 现在,当我拿钥匙的时候。pem密钥对表示模数 我得到这个字符串(我已经省略了标题 您可以看到,我提取的密钥数据和base64编码的密钥数据实际上存在于从密钥中提取的有效公钥数据的数据中。pem使用openssl。然而,开头有45个字符,我自