提供声明 - 使复合赋值非法,而简单赋值合法

Provide declaration - To make a compound assignment illegal, while simple assignment legal

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

这可以通过将 x 声明为 short 并将 i 声明为 int 来完成。因为 += 包含隐藏的强制转换而 x = x + i 不包含 - 导致编译错误。

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

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

但是我可以毫无错误地编译它们吗?

你是对的,解决方案是错误的。说 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 的类型是一个超级 class 或与 x + i 的类型相同的 class。这也意味着对于 x += i,类型转换永远不会失败 iff​​ x = x + i 是合法的,因为如果 x = x + i 是合法的,则不会发生收缩转换.

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