5

さて、java.util.Collection インターフェースを実装する動的な 2D 配列を Java で作成しています。通常の と同じ機能を持たせたかったので、配列にそれを実装させましたCollectionsize()ただし、インターフェイスで整数を返し、2D マトリックスが整数型をオーバーフローする可能性があるため、メソッドを実装できません。

これが私が作ろうとしている私のクラスのスニペットです:

public abstract class AbstractMatrix<E> implements Collection<E>{
     @Override
     public long size() {
         return columns * rows;
     }
}

現在、これは機能しません。「戻り値の型は互換性がありませんCollection<E>.size()」。型を int に変更すると、列 * 行がオーバーフローする可能性があります。

Collectionこのように size メソッドをオーバーライドできないことはわかっていますが、インターフェイスを実装している間にメソッドが正しいサイズを返すようにする方法はありますか?

はい、これが非現実的であり、おそらく問題にならないことはわかっていますが、それに対する適切な解決策があるかどうかを知りたいと思っていました.

4

4 に答える 4

2

の実装にsizeは疑問がありますが、のコントラクトはjavadocCollection#sizeで定義されています。

このコレクションの要素数を返します。このコレクションにInteger.MAX_VALUEを超える要素が含まれている場合は、Integer.MAX_VALUEを返します。

したがって、サイズをとして計算し、それが。より大きい場合はlong返すことができます。Integer.MAX_VALUEInteger.MAX_VALUE

LinkedList#addまたは、たとえば、sizeが単純にインクリメントされてオーバーフローが許可される場合の実装方法を模倣することもできます。

于 2012-06-18T16:59:20.267 に答える
2

8GBの配列(合計サイズでオーバーフローする2次元配列の最小サイズ)をint用意し、そのコレクションを反復処理するなど、そのコレクションで何か面白いことをする意思があると仮定します(数回のコストがかかります)。少なくとも反復のためだけに数分)...

典型的なアプローチは、Javadocで指定されているように、実装に戻るのでIterableはなくCollection、単に戻るのいずれかであると思います。Integer.MAX_VALUE

このコレクションの要素数を返します。このコレクションにInteger.MAX_VALUEを超える要素が含まれている場合は、Integer.MAX_VALUEを返します。

于 2012-06-18T16:59:20.627 に答える
0

オーバーフローする可能性のある十分な大きさの行列が本当に心配な場合は、結果のサイズ(初期化またはサイズ変更)がまだ整数の範囲内にあるかどうかを確認して、オーバーフローが発生しないようにし、その場合は(実行時)例外をスローします。ケースになります

于 2012-06-18T16:59:16.150 に答える
-1

私はそうは思いません、あなたはある種の回避策を使う必要があるでしょう。サイズを拡張して負の数を返し、それらを符号なし32ビット整数として解釈すると、最大40億と変化する可能性があります。

しかし、自問してみてください。本当に多くのオブジェクトをサポートできる必要がありますか?40億と32ビット整数の変更は16GBのRAMを消費することに注意してください。Object64ビットJavaを使用すると、64ビットJavaの参照は64ビットであるため、すべてnullに設定された40億の長さの配列は32GBを使用します。これは、実際にその多くのクラスをインスタンス化するために使用されるメモリを考慮に入れていません。これは、おそらくはるかに高くなります。

于 2012-06-18T16:59:03.123 に答える