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

为什么我可以将一个整数文本赋给一个short类型的变量,而不能赋给一个short类型的方法参数?

胡野
2023-03-14
short a = 5;
void setNum(short a);

setNum(5);

从int到short的转换可能有损

我知道5是一个整数字面,你必须对它进行强制转换。我还理解,如果该值不是常量,那么显然需要抛出该错误,因为可能该值达到了短类型的极限。但是,如果编译器知道我传递的是一个short可以保持的常量(如赋值中的那样),为什么它不让它编译呢?我是说,它们之间有什么区别?

共有1个答案

於子晋
2023-03-14

为了理解为什么赋值类型转换可以工作,而调用类型转换被拒绝,我们必须参考Java语言规范主题,以便缩小基元转换和该转换的上下文:赋值上下文和调用上下文。

根据JLS,如果:

如果变量的类型是byte、short或char,并且常量表达式的值可以在变量的类型中表示,则可以使用缩小基元转换。

JLS一定不想让编译器负担这种额外的逻辑。在调用的情况下,与形参类型匹配的参数是一个表达式编译器已经必须确定类型,但它不需要检查表达式的值是否也可以安全地缩小。在这种情况下,作为一个常量,我们很清楚它可以是常量,但是在执行上下文中,编译器被允许不费心检查,并且实际上不允许它是正确的。

应该很清楚的是,当允许表达式时,如果不能在不损失精度的情况下进行缩小,那么bug就更容易爬进来,所以JL和编译器在所有情况下都不允许这样做。

在数值上下文中也是如此,因此声明

short a = 5;short b = a * 5;
 类似资料:
  • 问题内容: 我为什么可以这样做: 但这不是: 它抛出: 从int到short可能的有损转换 我知道5是整数文字,您必须强制转换。我还了解,如果该值不是常数,则很明显需要抛出该错误,因为该值可能达到了short类型的限制。但是,为什么如果编译器知道我正在传递一个short可以容纳的常量(如在赋值中),则它不允许它进行编译?我的意思是,它们之间有什么区别? 问题答案: 为了理解为什么赋值类型转换在调用

  • 在我新创建的Angular应用程序中,我尝试使用mattlewis92的Angular日历来创建他的日历。我已经复制了他的github:https://mattlewis92.github.io/Angulat-calendar/#/kitchenter-sink上列出的所有步骤和代码,但我在第一行总是发现一个错误,即指出“{static:boolean;}类型的参数不能分配给{read?:any

  • 问题内容: 我想将一个类变量传递给另一个类,并使其成为该类的类变量。在以下情况下我该怎么做? 问题答案: 很难理解您正在问的问题,但这是一个可能的答案: 使B类成为A的子类: 如果重新声明为,则会出现一种情况,其中存在一个可以称为或的属性。(或在任一或刚刚…甚至作为或地方,并有类型和分别。) 如果您无法在和(或,以及一些包含声明的第三类)之间创建直接或子类型关系,那么您很不走运。他们无法共享声明。

  • 我知道byte不是一个合适的类型,不足以包含read方法的结果。 所以,read方法返回int类型值。 但我认为短类型比int更有效。 它可以包含范围-256~255的值。 为什么read方法返回int而不是short?

  • 我是angular的新手,我在学习这个hero教程时,偶然发现了这个错误: 我在这里复制了错误。

  • 问题内容: 我有三个简短的变量。当我将两个加在一起并将结果分配给第三个时,eclipse告诉我需要将其强制转换为short! 但是,当我先进行简单分配,然后进行增量分配时,一切都很好。 为什么是这样 ? 问题答案: JLS(第15.8.2节)说: “将二进制+运算符应用于两个数字类型的操作数时,将执行加法运算,从而得出这些操作数之和。” “对操作数执行二进制数值提升(第 5.6.2节 )。” 这意