假设我得到了A,B,C类,B
延伸A
而C
也延伸A
。
现在我有两个不同的课程,让我们称他们MyClassB
和MyClassC
成为ArrayList<B>
和ArrayList<C>
成员。
由于MyClassB
和MyClassC
中的许多操作是相同的,并且只在不同类型的ArrayList上完成,我想创建一个新的抽象类MyClassA
,它将具有一个实现两个classe对ArrayList<A>
的相同操作,因为A
是行为相同的共同部分。
所以我尝试在新的MyClassA
类中创建一个方法,该方法接收列表作为参数,并且应该对该列表进行操作。但是,我无法将ArrayList<B>
传递给预期ArrayList<A>
的方法。
那么我该怎样做才能将相同的动作保存在不同的类中而不重复2个不同类中的代码?
答案 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
}
}
现在MyClassB
和MyClassC
可以继承它,您可以正常使用该列表。
答案 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));
}
}
使用通配符解决方案无法将新元素添加到列表中,只允许“读取”操作。