0

如果您对故事不感兴趣,请跳过前 2 段。

我正在和一位朋友谈论数组,以及如果您尝试访问像 Objective C(这是我的主要语言)这样的“现代”语言中越界的对象,为什么它们(仍然)会崩溃。所以我们进行了一场辩论,我说我可以给他写一个数组(我将它命名为 GeniusArray),如果你尝试访问越界但不会崩溃,它会返回 null 并打印出错误。

睡过之后我意识到,如果您正在访问超出范围的元素,您的代码中会出现一些严重的错误,并且应用程序崩溃可能还不错,因此您不得不修复它。:-D

但仍然:我想证明我的观点并将一个 Array 子类化并重写 get() 方法,方法是基本上添加每个程序员相对经常编写的这个 if 语句:

// Pseudo code...
if (index < array.count) element= array[index];

我想用Java而不是Objective C来做,因为这是我朋友“知道”的(顺便说一句,我们都是学生)。

长话短说:我尝试将 Array 子类化,但它似乎不起作用。我明白了:

访问限制:由于所需库的限制,无法访问类型 Attribute.Array:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/classes.jar GeniusArray.java

4

4 回答 4

3

只有可以被子类化。数组类型不是类。(来自这里:“引用类型分为三种:类类型、接口类型和数组类型。”)

于 2009-10-14T08:04:27.707 回答
1

是的。正如您发现的那样,您不能从数组中继承。您必须从(比如说)一个 ArrayList 子类化并使用装饰器模式来拦截 get() 方法(和相关的)。

不幸的是,您也无法为 [] 提供运算符重载,因此您将与最初的目标相距甚远。

于 2009-10-14T07:43:09.220 回答
1

据我记得,你真的不能在 Java 中子类化 Array (它是一种特殊类型)。VM 对子类化可能会搞砸的数组做出一些假设。

通常,我会尽量远离数组。改用 ArrayLists。

于 2009-10-14T07:45:07.533 回答
1

出于性能原因,诸如 C、C++ 和 Objective-C 之类的语言不会检查数组边界(因此,如果您尝试访问具有无效索引的数组,则会导致不可预知的行为)。

Java 确实会检查每个数组访问的数组边界,ArrayIndexOutOfBoundsException如果您使用无效索引,您将得到一个。有人争辩说,由于这种内置检查数组在 Java 中的效率低于其他编程语言。

于 2009-10-14T08:11:09.413 回答