4

私は ArrayList クラスを拡張しようとしましたが、あまり成功しませんでした。それを拡張して、パラメータ化できるようにしたい。

したがって、通常、次のようなものがあります

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

私が欲しい

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

単に ArrayList を拡張するだけでは機能しません。

public class MyList extends ArrayList ...

使用しようとすると、エラーが発生します

MyList 型はジェネリックではありません。引数 <SomeObject> でパラメーター化することはできません

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

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

クラス名の背後にあるサブオブジェクトを使用すると、動作しているように見えますが、何らかの理由でサブオブジェクト クラスのメソッドが隠されています。

これを正しく機能させる方法についての考えや提案は大歓迎です。

4

3 に答える 3

12

ArrayListのタイプ パラメータのタイプを指定する必要があります。ジェネリック型パラメーターの場合、Tかなり一般的です。コンパイラは a が何であるかを認識しないため、型を渡すことができるT型パラメーターを に追加する必要がありますMyList。したがって、次のようになります。

public class MyList<T> extends ArrayList<T>

さらに、から継承するのではなく、を実装Listして委任することを検討することもできます。「クラスの継承よりもオブジェクトの構成を優先します。[デザイン パターンpg. 20]」ArrayListArrayList

于 2009-03-23T22:15:01.787 に答える
3
public class MyList<T> 
    extends ArrayList<T>
{
}

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

また

public class MyList
    extends ArrayList<SomeObject>
{
}

MyList list = new MyList();
于 2009-03-23T22:15:23.347 に答える
1

ArrayList を拡張しないでください。代わりにAbstractListを拡張してください。

public class MyList<T> extends AbstractList<T> {
    public int size() {...}
    public T get(int index) {...}
}
于 2009-03-23T22:23:53.420 に答える