【问题标题】:Provide declaration - To make a compound assignment illegal, while simple assignment legal提供声明 - 使复合赋值非法,而简单赋值合法
【发布时间】:2020-01-31 21:38:56
【问题描述】:

这个问题:- 复合赋值非法,而简单赋值合法。与我已经解决的问题相反。 提供声明以使 x += i(复合)合法而 x = x + i(简单)不合法

这可以通过将 x 声明为 short 并将 i 声明为 int 来完成。因为 += 包含一个隐藏的演员阵容,而 x = x + i 没有 - 导致编译错误。

但是,我无法在复合赋值非法而简单赋值合法的情况下进行赋值。此外,要解决这个问题的状态:-

对象 x = "你好"; 字符串 i = "世界"; 简单赋值是合法的,因为 x + i 是 String 类型,而 String 是与 Object 兼容的赋值。 x = x + 我; 复合赋值是非法的,因为左边是字符串以外的对象引用类型 x += i;

但是我可以无错误地编译两者吗?

【问题讨论】:

  • 提出这个问题的文本的出版日期是 2005 年。当时给出的解决方案可能已经“奏效”了,但这已经在现代 java 中得到修复。

标签: java syntax compiler-errors compilation variable-assignment


【解决方案1】:

您是对的,但解决方案是错误的。说Object+String 是完全合法的,因为这样你就可以得到StringObject += String 是合法的,因为这相当于Object = (Object)(Object+String),这是有效的,因为Object+String(如前所述)是String,并且可以向上转换(扩大) 到Object

如果你想让x = x + i 合法而x += i 非法,那实际上是不可能的。如在this answer 中所见,x += i 等价于x = (type of x) (x + i)。现在,如果x = x + i 是合法的,这意味着x 的类型是超类或与x + i 的类型相同的类。这也意味着对于x += i,类型转换永远不会失败iff x = x + i 是合法的,因为如果x = x + i 是合法的,则不会发生缩小转换。

tl;dr:逻辑有点循环,但它本质上是说如果x = x + i 在没有强制转换的情况下成功,那么在x += i 中强制转换也会成功,因为你必须检查是否适合type of x无论如何,在第一个语句中。

【讨论】:

    猜你喜欢
    • 2016-09-17
    • 1970-01-01
    • 2012-01-21
    • 2010-12-07
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 2021-04-24
    相关资源
    最近更新 更多