不兼容的类型。必需:短,找到: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
而不是 int
或 boolean
会在全面测试中得到回报的场景。由于int
的内部优化,甚至存在short
比int
慢的情况。此外,与可能的微性能改进相比,由于不需要的溢出(无一例外)导致的潜在错误通常太高了。当然,这取决于您的应用程序,这就是我问的原因。
@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
分配给short
的short
字段,因为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”?
类型不匹配。必需:布尔值,在 Scala 中找到:Future[Boolean]
BlueJ 错误:“不兼容的类型:int 无法转换为 java.lang.String”和“不兼容的类型:java.lang.String 无法转换为 int”