Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不兼容的类型。必需:短,找到:int_Java - Fatal编程技术网

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;