如果您对某个故事不感兴趣,请跳过前两段。
我正在和一位朋友谈论数组,以及为什么他们(仍然)崩溃,如果你试图访问一个超出“现代”语言的对象,比如Objective C(这是我的主要语言)。所以我们进入了一场辩论,我说我可以给他写一个Array(我把它命名为GeniusArray),如果你试图访问一些超出界限但没有崩溃的话,它会返回null并打印出错误。
在它上面睡觉后,我意识到如果你正在访问超出范围的元素,你的代码中会出现一些严重的错误,这可能不会让应用程序崩溃,所以你不得不修复它。 :-D
但是仍然:我想证明我的观点和子类是一个数组,并通过基本上添加每个程序员经常写的if语句来覆盖get()方法:
// 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
答案 0 :(得分:3)
只能类进行子类化。数组类型不是类。 (来自here:“有三种引用类型:类类型,接口类型和数组类型。”)
答案 1 :(得分:1)
是。正如您所发现的,您不能从数组中继承子类。你必须从(比方说)一个ArrayList子类化并使用Decorator模式来拦截get()方法(和相关的)。
不幸的是,您无法为[]提供运算符重载,因此您将与原始目标保持一定距离。
答案 2 :(得分:1)
据我所知,你真的不能用Java子类化一个数组(它是一种特殊的类型)。 VM对子类化可能搞乱的数组做了一些假设。
通常情况下,我会尽量远离数组。改为使用ArrayLists。
答案 3 :(得分:1)
出于性能原因,C,C ++和Objective-C等语言不检查数组边界(因此如果尝试访问具有无效索引的数组,则会导致不可预测的行为)。
Java会检查每个数组访问的数组边界,如果使用无效索引,则会得到ArrayIndexOutOfBoundsException
。有些人认为,由于Java中的这种内置检查数组效率低于其他编程语言。