2009-03-23 10 views
4

ArrayListクラスをあまり拡張せずに拡張しようとしています。私はそれを拡張し、それをパラメータ化できるようにしたい。拡張コレクションをパラメータ化する方法

だから、通常、私は単純に拡張ArrayListには動作しません

MyList<SomeObject> list = new MyList<SomeObject>(); 

をしたい

ArrayList<SomeObject> list = new ArrayList<SomeObject>(); 

のようなものを持っています。

public class MyList extends ArrayList ... 

ザ・私はそれを使用しようとすると、私はエラー

がタイプMYLISTはジェネリックではありません取得します。それ は引数 < SomeObjectの>

私はクラス名の後ろにサブオブジェクトを使用している場合は、動作するように表示され、成功しません

public class MyList extends ArrayList<Object> 
public class MyList<SubObject> extends ArrayList<Object> 

のバリエーションを試してみた

が、皮革をパラメータ化することができません何らかの理由でサブオブジェクトクラスのメソッド

この権利を取得する方法に関するご意見やご感想はありがたいです。

答えて

12

ArrayListの型パラメータの型を指定する必要があります。ジェネリック型パラメータの場合、Tはかなり一般的です。コンパイラはTが何であるかを知らないので、あなたは、渡された型を持つことができるMyListに型パラメータを追加する必要がありますしたがって、あなたが得る:。

public class MyList<T> extends ArrayList<T> 

また、あなたがListの実装を検討することをお勧めしますArrayListから継承するのではなく、ArrayListに委任します。 "クラスの継承を介してオブジェクト合成を優先[デザインパターン PG 20。]。"

3
public class MyList<T> 
    extends ArrayList<T> 
{ 
} 

MyList<SomeObject> list = new MyList<SomeObject>(); 

または

public class MyList 
    extends ArrayList<SomeObject> 
{ 
} 

MyList list = new MyList(); 
1

あなたはArrayListのを拡張するべきではありません、代わりにAbstractListを拡張:

public class MyList<T> extends AbstractList<T> { 
    public int size() {...} 
    public T get(int index) {...} 
} 
関連する問題