不兼容的类型。必需:短,找到:int [重复]

Posted

技术标签:

【中文标题】不兼容的类型。必需:短,找到:int [重复]【英文标题】:Incompatible types. Required: short, Found: int [duplicate] 【发布时间】:2018-08-19 20:40:19 【问题描述】:

我只是无法理解这之间的区别:

short d = 0; //some code node.accessible = d + 1;

还有这个

short d = 0 //same code here node.accessible = d; node.accessible += 1;

第二件事有效,但第一件事不是 inteliji 显示“不兼容的类型”错误。

附言节点类:

public class Node 
int n;
short accessible;
Node(int n)
    this.n = n;
    this.accessible = -1;

   

【问题讨论】:

您是不是要输入+= 而不是=+ 一开始你为什么还要使用short?在我长期使用的 Java 载体中,我很少发现使用 short 而不是 intboolean 会在全面测试中得到回报的场景。由于int 的内部优化,甚至存在shortint 慢的情况。此外,与可能的微性能改进相比,由于不需要的溢出(无一例外)导致的潜在错误通常太高了。当然,这取决于您的应用程序,这就是我问的原因。 @Zabuza 谢谢,我会注意这一点,但现在我只是好奇。 【参考方案1】:

在第一个版本中:

node.accessible = d + 1;

d + 1 产生一个int,因为将一个int 和一个short 相加产生一个int。JLS 确实表明(看最后一个案例,重点是我的):

5.6.2。二进制数字提升

当一个运算符将二进制数字提升应用于一对 操作数,每个操作数必须表示一个可转换为 数字类型,按顺序适用以下规则:

    如果任何操作数是引用类型,则对其进行拆箱 转换(第 5.1.8 节)。

    加宽原语转换(第 5.1.2 节)适用于转换以下规则中指定的一个或两个操作数:

    如果任一操作数是 double 类型,则另一个将转换为 double。

    否则,如果任一操作数为浮点类型,则转换另一个 浮动。

    否则,如果任一操作数为 long 类型,则转换另一个 太长了。

    否则,两个操作数都转换为 int 类型

但是您不能将int 分配给shortshort 字段,因为int 的范围比short 的范围更广。


在第二个版本中,使用了复合赋值运算符 (+=):

node.accessible += 1;

因此,在您的情况下,操作结果将转换为 short :左侧变量的类型为 JLS 状态:

15.26.2.复合赋值运算符

E1 op= E2 形式的复合赋值表达式是等价的 到 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,除了 E1 是只评估一次。

更具体地说,在您的情况下:

否则,二进制运算的结果被转换为类型 左侧变量的值,经过值集转换(第 5.1.13 节) 到适当的标准值集(不是扩展指数值 set),并将转换结果存入变量中。

【讨论】:

问题是为什么+= 会自动向下转换而d + 1 不会。 JLS 对此的引用会很好。 @Zabuza 最后我无法删除它(接受)。我认为问题不仅是复合分配问题或int+short 问题的结果类型,而且两者都是。所以解决这两个问题更有意义。【参考方案2】:

这是因为 1 在您的 + 1 表达式中是 int 类型。将short 添加到int 会得到int,如果没有缩小转换回node.accessible,就无法分配。

【讨论】:

【参考方案3】:

在第二个样本中,

node.accessible += 1;

其实是

node.accessible = (short)(node.accessible + 1);

所以它没有问题。 但在第一个 node.accessible = d + 1; 实际上是 node.accessible = d + 1;,它不会自动转换为短,因此会给出错误,因为 (d + 1) 的类型是 int

【讨论】:

问题已经更新,但仅供参考......=+ 1 起作用的原因实际上是它是= +1 - 也就是说,您分配给一个正数的 int 文字1. 但是由于该字面量也是一个常量,并且编译器可以确认它适合 short,因此通过 JLS 5.2,缩小转换(从 int 到 short)成功。 我认为=+ 1 是一个错字,实际上是+= 1 并相应地写下了我的答案。但谢谢你;)

以上是关于不兼容的类型。必需:短,找到:int [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥此错误显示“不兼容的类型”。 “必需:android.support.v4.app.Fragment”?

编译器错误`在if语句中分配不兼容的类型`[重复]

火花类型不匹配错误 - 发现:任何但必需:列表[重复]

类型不匹配。必需:布尔值,在 Scala 中找到:Future[Boolean]

Hashmap 错误:不兼容的类型

BlueJ 错误:“不兼容的类型:int 无法转换为 java.lang.String”和“不兼容的类型:java.lang.String 无法转换为 int”