0

ストーリーに興味がない場合は、最初の2段落をスキップしてください。

私は友人と配列について話していました。ObjectiveC(これが私の主な言語です)のような「現代」の言語で範囲外のオブジェクトにアクセスしようとすると、配列が(まだ)クラッシュする理由について話していました。そこで私たちは議論に巻き込まれ、範囲外の何かにアクセスしようとしてもクラッシュしない場合にnullを返し、エラーを出力する配列(私はGeniusArrayと名付けました)を彼に書くことができると言いました。

その上で眠った後、範囲外の要素にアクセスしている場合、コードに重大なエラーがあり、アプリがクラッシュするのは悪くないので、修正を余儀なくされることに気付きました。:-D

しかし、それでも:私は自分の主張を証明し、配列をサブクラス化し、基本的にすべてのプログラマーが比較的頻繁に書くifステートメントを追加することでget()メソッドをオーバーライドしたいと思います。

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

私の友人が「知っている」ので、Objective CではなくJavaでそれをやりたいと思っています(ところで、私たちは両方とも学生です)。

簡単に言うと、配列をサブクラス化しようとしましたが、機能しないようです。私はこれを取得しています:

アクセス制限:必要なライブラリの制限により、タイプAttribute.Arrayにアクセスできません:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/classes.jar GeniusArray.java

4

4 に答える 4

3

サブクラス化できるのはクラスのみです。配列型はクラスではありません。(ここから:「参照型には、クラス型、インターフェイス型、配列型の3種類があります。」)

于 2009-10-14T08:04:27.707 に答える
1

はい。ご存知のとおり、配列からサブクラス化することはできません。(たとえば)ArrayListからサブクラス化し、Decoratorパターンを使用してget()メソッド(および関連する)をインターセプトする必要があります。

残念ながら、[]にも演算子のオーバーロードを提供できないため、元の目的からある程度離れることになります。

于 2009-10-14T07:43:09.220 に答える
1

私が覚えている限り、Javaで配列をサブクラス化することはできません(これは特別なタイプです)。VMは、サブクラス化が混乱する可能性がある配列についていくつかの仮定を行います。

通常、私は配列から離れようとします。代わりにArrayListsを使用してください。

于 2009-10-14T07:45:07.533 に答える
1

C、C ++、Objective-Cなどの言語は、パフォーマンス上の理由から、配列の境界をチェックしません(したがって、無効なインデックスを持つ配列にアクセスしようとすると、予期しない動作が発生します)。

Javaは、すべての配列アクセスで配列の境界をチェックしますArrayIndexOutOfBoundsException。無効なインデックスを使用すると、が取得されます。この組み込みのチェック配列のために、Javaのチェック配列は他のプログラミング言語よりも効率が悪いと主張する人もいます。

于 2009-10-14T08:11:09.413 に答える