Javaの場合ArrayList<E>
オブジェクトの配列のベースを実装します。 ArrayList<E>
の実装で、E[]
の代わりにデータ格納用に配列Object[]
を使用する理由を誰でも説明できますか? Object[]
を使用するとどのようなメリットがありますか?ArrayListの実装でObject []が使用されるのはなぜですか?
答えて
Javaでは、ジェネリック型の配列を作成するのは簡単ではありません。
単純なアプローチは、コンパイルされない:
public class Container<E> {
E[] arr = new E[3]; // ERROR: Cannot create a generic array of E
}
はObject
とE
を交換し、すべてが(他のコンテナの実装に追加の複雑さを犠牲に)十分です。
代替アプローチがありますが、異なるトレードオフのセットがあります。広範な議論のために、How to create a generic array in Java?
がtype erasureを考慮するとご覧(つまり、あなたの例では、このようなE
としてジェネリック型パラメータを編集タイプで削除されているという事実です)、私は、生成されたバイトコードは両方のケースで同様であろうと思います。
メンテナンスの観点から、Objectではなくtypeパラメータを使用すると、コードを読みやすくなります(キャストが制限されるため)。しかしArrayList
のAPIは "raw" Object
という配列を公開していないので、単純なJava開発者にとってはそれほど大きな違いはありません:
まず最初に、配列オブジェクトの実際の実行時の型Object[]
となります。これは、配列が実行時にコンポーネントの型を知っているためです(異なる配列型は実際には実行時に異なる型です)。したがって、配列の作成時にコンポーネント型を指定する必要がありますが、ArrayList
オブジェクトは実行時に型引数を認識しません。
それはObject[]
として宣言された場合:
private Object[] arr;
// to create it:
arr = new Object[3];
// to get an element:
E get(int i) { return (E)arr[i]; }
インスタンス変数のコンパイル時の型が異なる長所と短所と、Object[]
又はE[]
のいずれかとして宣言することができ、前記
欠点は、何かを取り出すたびにE
にキャストしなければならないということです。つまり、基本的にはジェネリック医薬品前のコンテナとして使用しています。
、それが宣言されている場合はE[]
として:
private E[] arr;
// to create it:
arr = (E[])new Object[3];
// to get an element:
E get(int i) { return arr[i]; }
この方法の利点は、あなたは、もはやあなたがそれから物事を取得するときにキャストする必要がないということである - それは型チェックarr
の用途に提供し、ジェネリックコンテナのように。不利な点は、論理的にはキャストが存在することです。実行時の型がObject[]
であるオブジェクトが作成されていることがわかっているので、E
がObject
でない限り、E[]
のインスタンスではありません。
ただし、E
がクラスのインスタンスメソッド内でObject
に消去されるため、すぐに問題が発生することはありません。問題が発生する唯一の方法は、オブジェクトが何らかの理由でクラスの外部に公開されている(メソッドで返された、パブリックフィールドに置かれたなど)、その型をE[]
(それはそうではない) :
// This would be bad. It would cause a class cast exception at the call site
E[] getArray() { return arr; }
しかしArrayList
、そして実際には任意の適切に設計されたコンテナクラスは、そのような外部への内部配列として実装の詳細を公開することはありません。それは他のものの中で抽象化を破るだろう。したがって、このクラスの作成者がこの配列を公開していないことを認識している限り、このようにすることは問題ありません(おそらくコードを見ている次の人を混乱させずに)このようにして増加した型チェックの利点。
- 1. なぜobject = nullが常に使用されるのですか?
- 2. なぜArrayListはQueueを実装しないのですか?
- 3. ArrayListがコンパレータでソートされないのはなぜですか?
- 4. [object HTMLImageElement]が表示されるのはなぜですか?
- 5. JavaがArrayListクラスを使用してHashtable/HashMapクラスを実装していないのはなぜですか?
- 6. RxJavaでflatMapがmergeで実装されているのはなぜですか?
- 7. ExpressでNode.jsスタイルのコールバックが実装されないのはなぜですか?
- 8. retrofitとrecyclerviewを使用する - なぜArrayListのArrayListがnullですか?
- 9. ArrayList <?>、ArrayList、ArrayList <Object>の違いは何ですか?
- 10. JavaでObjectのHashcodeが変更されるのはなぜですか?
- 11. 非形式のテンプレートパラメータを使用してstd :: bindのプレースホルダが実装されないのはなぜですか?
- 12. JavaがSetとArrayListの異なるハッシュコードメソッドを実装するのはなぜですか?
- 13. 初期化時に子クラスの実装が使用されるのはなぜですか?
- 14. ObjectでequalsとhashCodeが定義されているのはなぜですか?
- 15. ObjectとValueTypeクラスで実装されたGetHashCodeの違いは何ですか?
- 16. プライオリティキューがバイナリヒープとして実装されているのはなぜですか?
- 17. getpidがシステムコールとして実装されているのはなぜですか?
- 18. Stringが実装されないのはなぜですか<&String>?
- 19. HTTPでTCPが使用されるのはなぜですか?
- 20. 実装されたクラスでsuperの使用は何ですか?
- 21. Java - ArrayListとArrayListは<Object>の2つの異なるクラスですか?
- 22. java.util.Arraylist#clearがOpenJDKのように実装されたのはなぜですか?
- 23. なぜArrayListのaddAllメソッドを使用しないのですか?
- 24. ベクターがアソシエーティブを実装するのはなぜですか?
- 25. strcmpの実装で特殊文字が使用されない
- 26. ArrayList項目がJavaのオブジェクトに変換されるのはなぜですか?
- 27. JPanelのArrayListでsetLayoutメソッドを使用できないのはなぜですか?
- 28. 多態性: "ArrayList list = new ArrayList"の代わりに "List list = new ArrayList"を使用するのはなぜですか?
- 29. MouseListed()関数でArrayListの長さが0になるのはなぜですか?
- 30. インタフェースループで使用される実装
あなたはそうです!ありがとうございました!!! – user485553
@ E {] arr =(E [])新しいオブジェクト[3]; ' – Saintali
@Saintali:あなたはできますが、あなたが作業しようとする瞬間に' ClassCastException'を取得しますこの配列。それを試してみてください。 – NPE