如果我们看一下Java 8语言规范§15.26.1
- 否则,index子表达式的值用于选择由数组引用子表达式的值引用的数组的组件。
这个组件是一个变量;称其类型为SC 。此外,令TC为编译时确定的赋值运算符左侧操作数的类型。然后有两种可能性:
- 如果TC是基本类型,则SC必须与TC相同。
将右侧操作数的值转换为所选数组的类型,进行值集转换(第5.113节)到相应的标准值集(不是扩展指数值集),并且转换的结果存储在数组组件中。
所以,代码是这样的:
int TC = 15;
int[] SC = {1,2,3,4,5};
TC = SC[0];
执行1:右侧操作数
SC[0]
的值为1.
执行2:然后将1转换为所选数组组件SC[0]
的类型。
执行3:1转换为int。
执行4:1存储回
SC[0]
。
如果我们按照该步骤操作,则代码为:
TC = SC[0];
永远不会发生,因为SC[0]
会被存储回自身。
它应该说:
- 否则,index子表达式的值用于选择由数组引用子表达式的值引用的数组的组件。
这个组件是一个变量;称其类型为SC 。此外,让TC成为编译时确定的赋值运算符右侧操作数的类型。然后有两种可能性:
- 如果TC是基本类型,则SC必须与TC相同。
将右侧操作数的值转换为所选数组的类型,进行值集转换(第5.113节)到相应的标准值集(不是扩展指数值集),并且转换的结果存储在数组组件中。
所以像这样的代码:
int TC = 15;
int[] SC = {1,2,3,4,5};
SC[0] = TC;
会运行,TC
的值会存储到SC[0]
我的问题:我是对的吗?
答案 0 :(得分:1)
您似乎误读了JLS的这一部分的上下文。
您引用的部分以
开头如果左侧操作数是数组访问表达式(第15.10.3节),可能包含在一对或多对括号中
数组位于左侧,如
t[0] = 1;
我不确定为什么你认为这意味着什么,但它总是明确地处理数组元素的赋值。
本条款要解决的具体问题是:
interface TC {};
class SC implements TC {};
class RC implements TC {};
TC[] tcArray = new SC[1];
tcArray[0] = new RC();
该代码(忽略语法快捷方式)编译,但需要在运行时使用ArrayStoreException
失败。