TC应该是Java 8语言规范

时间:2016-01-16 12:34:54

标签: java

如果我们看一下Java 8语言规范§15.26.1

  
      
  • 否则,index子表达式的值用于选择由数组引用子表达式的值引用的数组的组件。
  •   
     
    

这个组件是一个变量;称其类型为SC 。此外,令TC为编译时确定的赋值运算符左侧操作数的类型。然后有两种可能性:

         
      
          
  • 如果TC是基本类型,则SC必须与TC相同。
  •       
             

将右侧操作数的值转换为所选数组的类型,进行值集转换(第5.113节)到相应的标准值集(不是扩展指数值集),并且转换的结果存储在数组组件中。

    
  
  1. 它表示“让TC为赋值运算符的左侧操作数的类型”,因此TC是左操作数,SC是数组的组成部分,是右边的类型操作数。
  2. 所以,代码是这样的:

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

    1. 接下来是奇怪的事情,它说“右手操作数的值转换为所选数组件的类型”
    2.   

      执行1:右侧操作数SC[0]的值为1.
        执行2:然后将1转换为所选数组组件SC[0]的类型。
        执行3:1转换为int。

      1. “并将转化结果存储到数组组件”
      2.   

        执行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]

        我的问题:我是对的吗?

1 个答案:

答案 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失败。