提供声明 - 使复合赋值非法,而简单赋值合法
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
是完全合法的,因为这样你就可以得到 String
。 也说Object += 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
。
这道题:- 使复合赋值非法,而简单赋值合法。与我已经解决的问题相反。 提供声明以使 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
是完全合法的,因为这样你就可以得到 String
。 也说Object += 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
。