2

从我一直在读的一本书中,它说

int[] splats;
int[] dats = new int[4];
char[] letters = new char[5];
splats = dats;     //ok
splats = letters;   //not ok

它不允许这种分配的机制是什么?

编辑

与此任务相反,

int[] weightList = new int[5];
byte b = 4;
char c = 'c';
short s = 7;
weightList[0] = b;   //ok
weightList[1] = c;   //ok
weightList[2] = s;   //ok

这是允许的。

编辑:
我想我明白扩大和缩小是如何工作的,但在我的脑海中

new int[4];
and
new char[4];

是堆中的两个数组对象,类型为“数组”。不是吗?
也许喜欢

new List<int>
and 
new List<char>

当然,它们各自的元素类型不同,但 List 对象本身属于相同的 List 类型。
我读到只要分配方具有更窄的类型(子类),就允许对象数组执行该操作。
所以也许我可以这样想

因为原始类型 char 不继承原始类型 int,所以不能将 chars 数组重新分配给 ints 数组?


当然,一种原始类型“扩展”另一种听起来不正确,只是为了让它更容易理解。

4

7 回答 7

2

“机制”是类型安全。

  • 引用与引用char[]的类型不同int[]
  • 它们之间没有继承关系
  • 没有指定的扩大转换规则

所以转让是非法的。

于 2013-05-14T07:00:10.970 回答
2

编译器检查类型。一个基元数组只能分配给另一个具有相同类型的基元数组。

于 2013-05-14T06:46:10.137 回答
1

您询问了Java机制。在这个简短的例子中,java 使用了 Widening Primitive Conversion 和 Narrowing Primitive Conversion。更清楚地了解?你可以阅读这篇文章

于 2013-05-14T06:59:22.003 回答
1
splats = dats;     //ok

无论大小/长度如何,都持有对类型splats数组的引用。它可以保存对其他数组的引用,但只能是类型。intint

splats = letters;

上一行中,类型不同,所以不能赋值。

对于您的编辑:

weightList[0] = b;   //ok

sinceweightList是 int 类型,它可以容纳 char,byteshort数据类型 becauseint是 32 位,其中 asbyte是 8 位,short andchar是 16 位。

你应该看到:5.1.2。扩大基元转换

原始类型的 19 种特定转换称为扩展原始类型转换:

  • 字节到 short、int、long、float 或 double
  • 短到 int、long、float 或 double
  • char 到 int、long、float 或 double
  • int 到 long、float 或 double
  • 长时间浮动或加倍
  • 浮动加倍

加宽基元转换不会丢失有关数值整体大小的信息。

于 2013-05-14T06:49:18.303 回答
1
weightList[0] = b;   //ok because its byte
weightList[1] = c;   //ok because it converts to ASCII 
weightList[2] = s;   //ok Directly store , because its short

是的,这些可以很容易地映射到 int 数组中。因为这些值单独插入到索引 (0,1,2) 中,所以这些值必须小于 int 数据类型的容量。在类型转换时,大小和长度很重要。这可能是上限或下限。在这里阅读

于 2013-05-14T06:53:00.247 回答
0

只有当数组本身的类型相同时,Java 才允许对数组引用进行赋值,而不是在元素类型与赋值兼容的情况下。这被称为具有“不变”数组。

这与数组的长度无关,而与类型有关。

这不受是否可以通过默默地扩大值来单独为元素分配特定值的影响。

于 2013-05-14T06:50:15.607 回答
0

对于数组,应用与任何其他类型变量相同的规则。如果数组是相同类型或派生自它,您可以分配它,否则不能。

例如:

 JComponent[] a = null;
 JTextField[] b = null;
 a = b;   <- OK, because JTextfield is derived from JComponent.
 b = a;   <- error because JComponent is NOT derived from JTextField

这是否是一个数组并不重要,因为只有类型很重要:

 JComponent a = null;
 JTextField b = null;
 a = b;   <- OK, because JTextfield is derived from JComponent.
 b = a;   <- error because JComponent is NOT derived from JTextField

在您的情况下, char 和 int 彼此无关,因此无法分配它们。

于 2013-05-14T06:57:10.247 回答