当前位置: 首页 > 知识库问答 >
问题:

为什么允许从int到byte的隐式缩窄转换,而不允许从long到int的隐式缩窄转换?

卫劲
2023-03-14
// automatic casting works for int to byte conversion as integer literal 127
// is in the range for byte
byte b1 = 127; //OK

// automatic casting doesn't work for long to int conversion 
// even if long literal is in the range of int.
int i5 = 100L; // NOT OK - compilation error

共有1个答案

华子航
2023-03-14

加宽转换(例如byteint)通常被Java编译器隐式地接受,因为不会丢失信息(int的范围大于byte)。

缩小转换范围(例如long转换为int,如您的情况)会导致信息丢失,因此通常需要显式转换。

看到这个类似的问题,还有这个。Java语言规范的一个相关部分:

如果变量的类型为:

>

  • 字节,并且常量表达式的值可以在类型字节中表示

    Short,并且常量表达式的值可以在Short类型中表示。

    byte b1=127执行隐式转换(参见上面引号中的粗体文本),“常量表达式的值在类型字节中是可表示的”。也就是说,127可由字节表示,因此转换是隐式的。如果您尝试byte b1=128,您将得到一个关于不兼容类型的错误,因为byte不能表示128。这里允许隐式强制转换的唯一原因是我们使用的是常量表达式。

    我们在inti5=100L中没有得到隐式转换(即使100在int的范围内),因为它没有在允许的隐式转换中列出(变量的类型int不是byteshortchar之一)。

    我们也不会在字节a=0L中得到隐式转换,这一次是因为常量表达式的类型为long,而不是byteshortcharint

    一个普通的程序员如何知道隐式允许哪一种缩小转换?

    隐式缩窄转换仅在为变量赋值常量表达式时发生。在这些情况下,隐式转换是很好的,因为我们不希望一直编写类似byte b=(byte)0的代码。同时,如果我们编写类似byte b=128的代码,我们确实希望得到警告,因为它没有直观的行为。

    当我们不赋值常量表达式(例如int x=0;byte b=x;)时,我们总是希望在进行潜在的有损转换时得到警告,因为它们是危险的-因此在这种情况下显式转换也是有意义的。

  •  类似资料:
    • 问题内容: 我可以隐式地将int转换为long,并将long转换为Long。为什么无法将int隐式转换为Long?为什么Java不能在示例的最后一行进行隐式转换? 问题答案: 和是对象。装箱/拆箱仅适用于原语。做的就像,那不是不!另外,请记住,之间没有继承,所以甚至无效

    • 在java中,隐式转换的层次结构是long可以容纳8字节的数据。那么为什么它被隐式地类型化为float,它只能容纳4个字节,而不是double,它可以容纳8个字节。为什么它不被认为是缩小呢? 哪些基元类型将隐式转换为char?

    • 所以,问题是--为什么在I=L的情况下,当L的大小足够小到适合I时,必须显式地进行,但在F=L的情况下,当L的大小也适合F时,铸造可以隐式地进行,而不会产生错误。 我的意思是,在这两种情况下,右操作数的大小可能不适合左操作数。那么,为什么在一种情况下(I=L),强制转换必须显式进行,而在另一种情况下(F=L)可以隐式进行呢?虽然隐式地将长var转换为int var比隐式地将长var转换为浮点var

    • 问题内容: 我想知道为什么Java不允许将布尔值转换为整数,如下所示: 例如,这可以用一行代码来完成, 但似乎更好和更容易阅读的方法是允许类型转换,如和一样。Java为什么不包括此功能? 问题答案: 不允许这样做是因为Java设计人员(正确地)认识到C和C ++中的布尔/整数重载是错误的重要来源。 (我记得曾经写过一些设计原理的书,但我找不到。) 例如: 是合法的,但可能是用C或C ++编写的应用

    • 问题内容: 您可以将int隐式转换为double: 您可以将int显式转换为double: 您可以将double显式转换为int: 为什么不能将一个double隐式转换为int? : 问题答案: 的范围比宽。这就是为什么您需要显式强制转换。由于相同的原因,您不能隐式地从转换为: