当包含基元类型时,Java 内置数组的访问运算符的返回类型是什么?



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

是原始char还是包装Character?

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

因为当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内置数组访问操作符的返回类型是什么?

是基本类型;例如,对于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, AND
  • 如果RHS表达式类型为int, AND
  • 如果RHS表达式是编译时常量表达式, AND
  • 如果RHS表达式值在LHS类型范围内,
  • 那么从int到LHS类型有一个隐式转换。

以上是JLS规则的简化…其中包括常量表达式的精确说明。

直观地说,编译器允许你省略类型强制转换,因为它"知道";类型强制转换不会丢失任何信息。

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

元素的类型总是对应于引用的类型(左侧)。如果原语赋值在类型为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

相关内容

  • 没有找到相关文章

最新更新