【问题标题】:What is the return type of Java built-in array's access operator when contains primitive type?包含原始类型时,Java 内置数组的访问运算符的返回类型是什么?
【发布时间】:2021-11-27 06:28:22
【问题描述】:

当数组xs 具有原始char 值并且有人尝试使用[] 访问该值时,返回类型是什么?

是原始的char 还是包装的Character

当数组包含charCharacter 时,我认为它总是Character 类型。

因为char减去int,结果的类型就是char

char x = 'A' - 1;

Character 减去int 时,结果类型为int

int x = new Character('A') - 1;

而表达式xs[0] - 1 的结果类型始终为int

char[] xs = {'A'};
int x = xs[0] - 1;


char[] xs = {new Character('A')};
int x = xs[0] - 1;

我说的对吗?我找不到关于 Java 数组运算符 [] 的结果类型和转换的文档。

【问题讨论】:

    标签: java arrays char character primitive


    【解决方案1】:

    Java 内置数组的访问操作符在包含原始类型时的返回类型是什么?

    它是原始类型;例如对于int[],它是int,对于char[],它是char,依此类推。


    但是,我认为您在这里相当困惑。

    应用于bytecharshortint(或其包装器类型)类型的操作数的所有 Java 算术运算符总是产生int 结果。所以'A' - 1new Character('A') - 1xs[0] - 1的表达式类型都是int

    这就是你在这里得到错误的原因:

     char a = 'A';
     char[] a2 = {'A'};
     char b = a + 1;                  // COMPILATION ERROR
     char c = a2[0] + 1;              // COMPILATION ERROR
     char d = new Character('A') + 1; // COMPILATION ERROR
    

    您需要类型转换才能使这些分配起作用。

    那么为什么您会收到以下编译错误?

     char x = 'A' - 1;
    

    简而言之,因为 'A' - 1 是一个(编译时)常量表达式,其 (int) 值将适合 char 而不会丢失任何信息。

    赋值运算符有一条特殊规则:

    • 如果 LHS 类型是 bytecharshort,则与
    • 如果 RHS 表达式类型是 int,则与
    • 如果 RHS 表达式是编译时常量表达式,AND
    • 如果 RHS 表达式的值在 LHS 类型的范围内,
    • THEN 存在从 int 到 LHS 类型的隐式转换。

    以上是 JLS 规则的简化...其中包括对常量表达式的精确规范。

    直观地说,编译器允许您省略类型转换,因为它“知道”类型转换不会丢失任何信息。

    【讨论】:

      【解决方案2】:

      当数组 xs 具有原始 char 值并且有人尝试使用 [] 访问该值时,返回类型是什么?

      元素的类型总是对应于引用的类型(左侧)。如果在右侧分配类型为Character[] 的基元,则自动装箱;如果在类型为char[] 的位置分配引用,则自动取消装箱

      您可以使用 instanceof Character 进行检查 - 它将返回 true 以验证它是 Character 或者如果它是一个原语则编译错误。

      char[] xs = {'A'};
      System.out.println(xs[0]); 
      System.out.println(xs[0] instanceof Character);   // COMPILE ERROR: unexpected type  required: reference  found: char
      
      char[] ys = {new Character('A')};
      System.out.println(ys[0]); 
      System.out.println(ys[0] instanceof Character);   // COMPILE ERROR: unexpected type  required: reference  found: char
           
      Character[] cs = {'A'};   
      System.out.println(cs[0] instanceof Character);   // true
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-21
        • 1970-01-01
        • 1970-01-01
        • 2017-03-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多