如何参数化扩展集合

时间:2009-03-23 22:11:17

标签: java collections parameterized extends

我一直在努力扩展ArrayList类,但没有取得多大成功。我想扩展它,并能够参数化它。

所以通常你会有像

这样的东西
ArrayList<SomeObject> list = new ArrayList<SomeObject>();

我想要

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

简单地扩展ArrayList不起作用。

public class MyList extends ArrayList ...

当我尝试使用它时,我收到错误

  

MyList类型不是通用的;它   不能用参数参数化   &LT; SomeObject&GT;

我尝试了各种

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

没有成功,如果我使用类名后面的子对象它似乎工作,但由于某种原因隐藏了子对象类中的方法。

对于如何使这项工作正确的任何想法或建议都表示赞赏。

3 个答案:

答案 0 :(得分:12)

您需要为ArrayList的类型参数指定类型。对于泛型类型参数,T相当常见。由于编译器不知道T是什么,因此您需要向MyList添加一个可以传入类型的类型参数。因此,您得到:

public class MyList<T> extends ArrayList<T>

此外,您可能需要考虑实施List并委派给ArrayList,而不是继承ArrayList。 “赞成对象组合而不是类继承。[设计模式第20页]”

答案 1 :(得分:3)

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

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

public class MyList
    extends ArrayList<SomeObject>
{
}

MyList list = new MyList();

答案 2 :(得分:1)

您不应该扩展ArrayList,而是扩展AbstractList

public class MyList<T> extends AbstractList<T> {
    public int size() {...}
    public T get(int index) {...}
}