具有泛型集合的类的Java适当扩展设计

时间:2015-05-25 13:58:09

标签: java arraylist

假设我得到了A,B,C类,B延伸AC也延伸A

现在我有两个不同的课程,让我们称他们MyClassBMyClassC成为ArrayList<B>ArrayList<C>成员。

由于MyClassBMyClassC中的许多操作是相同的,并且只在不同类型的ArrayList上完成,我想创建一个新的抽象类MyClassA,它将具有一个实现两个classe对ArrayList<A>的相同操作,因为A是行为相同的共同部分。

所以我尝试在新的MyClassA类中创建一个方法,该方法接收列表作为参数,并且应该对该列表进行操作。但是,我无法将ArrayList<B>传递给预期ArrayList<A>的方法。

那么我该怎样做才能将相同的动作保存在不同的类中而不重复2个不同类中的代码?

3 个答案:

答案 0 :(得分:3)

class MyClassA<T extends A>
{
    ArrayList<T> list;

    public MyClassA(ArrayList<T> list)
    {
        this.list = list;

...

class MyClassB extends MyClassA<B>
{
    MyClassB(ArrayList<B> list)
    {
         super(list);

答案 1 :(得分:1)

尝试使用泛型:

public class MyClassA<T extends A> {
    public void doSomething(ArrayList<T> list) {
        // do something
    }
}

现在MyClassBMyClassC可以继承它,您可以正常使用该列表。

答案 2 :(得分:0)

我看到两个选项:在基类中添加泛型或使用通配符:

public final class HolderB extends BaseBase<B>{

@Override
public void abstractAlgo(List<B> elements) { //uses the generic from the base class
  //add Bs
  elements.add(new B());
  //get Bs
  System.out.println(elements.get(0));
}

@Override
public void abstractAlgoWithWildcard(List<? extends Base> elements) { //uses the base class directly
   //add not possible Bs
  elements.add(new B());
  //get Bs
  System.out.println(elements.get(0));
}

}

使用通配符解决方案无法将新元素添加到列表中,只允许“读取”操作。