TC应该是Java8语言规范中的右操作数

TC应该是Java8语言规范中的右操作数,java,Java,如果我们看一下Java8语言规范 否则,索引子表达式的值将用于选择数组引用子表达式的值所引用的数组的组件 此组件是一个变量;将其类型称为SC。另外,设TC为赋值运算符的左操作数类型,如编译时确定的。然后有两种可能性: 如果TC是基本类型,那么SC必然与TC相同 将右侧操作数的值转换为选定阵列组件的类型,将值集转换(§5.1.13)为适当的标准值集(不是扩展指数值集),并将转换结果存储到阵列组件中 它说,“让TC是赋值运算符左侧操作数的类型”,因此TC是左侧操作数,SC是数组的组成部分,是

如果我们看一下Java8语言规范

  • 否则,索引子表达式的值将用于选择数组引用子表达式的值所引用的数组的组件
此组件是一个变量;将其类型称为SC。另外,设TC为赋值运算符的左操作数类型,如编译时确定的。然后有两种可能性:

  • 如果TC是基本类型,那么SC必然与TC相同
将右侧操作数的值转换为选定阵列组件的类型,将值集转换(§5.1.13)为适当的标准值集(不是扩展指数值集),并将转换结果存储到阵列组件中

  • 它说,“让TC是赋值运算符左侧操作数的类型”,因此TC是左侧操作数,SC是数组的组成部分,是右侧操作数的类型
  • 代码是这样的:

    inttc=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]
    存储回自身

    应该说:

    • 否则,索引子表达式的值将用于选择数组引用子表达式的值所引用的数组的组件
    此组件是一个变量;将其类型称为SC。另外,将TC设为赋值运算符的右操作数类型,如编译时确定的那样。然后有两种可能性:

    • 如果TC是基本类型,那么SC必然与TC相同
    将右侧操作数的值转换为选定阵列组件的类型,将值集转换(§5.1.13)为适当的标准值集(不是扩展指数值集),并将转换结果存储到阵列组件中

    所以代码是这样的:

    inttc=15
    int[]SC={1,2,3,4,5}
    SC[0]=TC

    将运行,
    TC
    的值存储到
    SC[0]


    我的问题:我说的对吗?

    您似乎误读了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

    问题是什么?好的。。但这不是问题。不,类不能扩展interfaceFine,我将粗略的示例代码改为语法更正确。但是,如果你真的想得到问题的答案,那么你可能想关注一些比简单例子中的打字错误更重要的问题。