Java 不兼容的类型。必需:短,找到:int
我只是不明白这两者之间的区别:Java 不兼容的类型。必需:短,找到:int,java,Java,我只是不明白这两者之间的区别: short d=0; //一些代码 node.accessible=d+1 还有这个 short d=0 //这里的代码相同 node.accessible=d; node.accessible+=1 第二件事是可行的,但第一件事不是inteliji显示了“不可比较的类型”错误 p、 美国节点类: public class Node { int n; short accessible; Node(int n){ this.n = n; this.a
short d=0;
//一些代码
node.accessible=d+1代码>
还有这个
short d=0
//这里的代码相同
node.accessible=d;
node.accessible+=1代码>
第二件事是可行的,但第一件事不是inteliji显示了“不可比较的类型”错误
p、 美国节点类:
public class Node {
int n;
short accessible;
Node(int n){
this.n = n;
this.accessible = -1;
}
}
在第一版中:
node.accessible = d + 1;
d+1
产生一个int
作为int
的和,short
产生一个int
事实上,这些国家(看看最后一个案例,重点是我的):
5.6.2。二进制数字促销
当运算符将二进制数字提升应用于一对
操作数,每个操作数必须表示可转换为
数字类型,按顺序应用以下规则:
如果任何操作数属于引用类型,则将对其进行取消装箱
转换(§5.1.8)
加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:
- 如果其中一个操作数的类型为double,则另一个操作数将转换为double
- 否则,如果其中一个操作数为float类型,则转换另一个操作数
漂浮
- 否则,如果其中一个操作数的类型为long,则转换另一个操作数
太久了
- 否则,两个操作数都转换为int类型
但是您不能将int
分配给可访问的字段,因为int
的范围比short
更广,因此该字段是没有显式转换的short
在第二个版本中,使用复合赋值运算符(+=
):
因此,在您的情况下,操作结果将转换为short
:左侧变量的类型,如下所示:
15.26.2。复合赋值运算符
形式为E1 op=E2的复合赋值表达式是等效的
to E1=(T)((E1)op(E2)),其中T是E1的类型,但E1除外
这只是一次评估
更具体地说,在您的案例中:
否则,二进制操作的结果将转换为类型
左侧变量的,经过值集转换(§5.1.13)
到适当的标准值集(不是扩展指数值
设置),并将转换结果存储到变量中
这是因为+1
表达式中的1
类型为int
。将short
添加到int
会产生int
,如果不缩小返回到节点的范围,则无法分配int
。在第二个示例中,可以访问
node.accessible += 1;
实际上是
node.accessible=(短)(node.accessible+1)代码>
因此,它的工作没有问题。
但是在第一个
node.accessible=d+1
实际上是node.accessible=d+1
不会自动转换为short,因此会出现错误,因为(d+1)
的类型是int
您是想键入+=
而不是=+
?为什么您一开始就使用short
?在我的长Java运营商中,我很少发现使用short
而不是int
或boolean
可以在全面测试中获得成功。甚至有些情况下,由于int
的内部优化,short
比int
慢。此外,与可能的微性能改进相比,由不必要的溢出(无一例外)导致的错误的可能性通常太高。当然,这取决于您的应用程序,这就是我为什么要问的原因。@Zabuza谢谢,我会注意到这一点,但现在我只是好奇。问题是为什么+=
会自动向下转换,而d+1
不会。JLS引用它会很好。@Zabuza最后我不能删除它(接受)。我认为问题不仅在于复合赋值问题或int
+short
问题的结果类型,还在于两者。因此,解决这两个问题更有意义。问题已经更新,但仅供参考。。。=+1
之所以有效,实际上是因为它是=+1
——也就是说,您将赋值给正1的int文本。但是,由于该文本也是一个常量,并且编译器可以确认它适合于一个简短的文本,通过JLS 5.2,缩小转换(从int到short)成功了。我认为=+1
是一个打字错误,实际上是+=1
,并相应地写下了我的答案。但是谢谢你;)
node.accessible += 1;