当数组xs
具有原始char
值并且有人试图使用[]
访问该值时,返回类型是什么?
是原始char
还是包装Character
?
我认为它总是Character
类型,当数组包含char
或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内置数组访问操作符的返回类型是什么?
是基本类型;例如,对于int[]
,它是int
,对于char[]
,它是char
,等等。
然而,我认为你在这里把自己弄糊涂了。
应用于byte
、char
、short
或int
类型的操作数(或其包装类型)的所有Java算术运算符总是产生int
结果。因此,'A' - 1
、new Character('A') - 1
和xs[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类型为
byte
、char
或short
, 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