Java不同类型的对象作为相同的参数

时间:2014-11-28 05:02:48

标签: java

我目前正在编写一个用于操作多个ArrayList的函数。

所有元素都有相同的构造函数,我怎么能这样做?

Class A{
public A (Cursor data){...}
}

Class B{
public B (Cursor data){...}
}

Class C{
public C (Cursor data){...}
}

public void dataManipulation(ArrayList<**?**> list, Cursor cursor){
cursor.moveToFirst();
for (int i = 0; i < cursor.getCount(); i++) {
            list(new **?**(cursor));
            if (!cursor.isAfterLast())
                cursor.moveToNext();

}

public void main(){
ArrayList<A> listA = new ArrayList<A>();
ArrayList<B> listB = new ArrayList<B>();
ArrayList<C> listC = new ArrayList<C>();

Cursor cursor = IMPORT_CURSOR_FROM_FILE;

dataManipulation(listA, cursor);
dataManipulation(listB, cursor);
dataManipulation(listC, cursor);
}

3 个答案:

答案 0 :(得分:4)

首先看一下Interfaces and Inheritance,基本上一个接口是一个合同,它可以实现任何实现该接口的对象将提供合同功能...

例如......

public interface CursorContainer {
    public Cursor getCursor();
}

你&#34;常见&#34; class将实现此接口并为getCursor(以及任何其他必需的)方法提供实现...

Class A implements CursorContainer {
    public A (Cursor data){...}
}

Class B implements CursorContainer  {
    public B (Cursor data){...}
}

Class C implements CursorContainer  {
    public C (Cursor data){...}
}

然后你可以使用泛型......

public void dataManipulation(ArrayList<CursorContainer> list, Cursor cursor){

您的下一个问题是知道如何创建特定的实现,为此,您将需要一个工厂......

public interface CursorContainerFactory {
    public CursorContainer create(Cursor cursor);
}

您需要为每种类型的容器创建一个工厂......

public Class CursorContainerAFactory implements CursorContainerFactory {
    public CursorContainer create(Cursor cursor) {
        return new A(cursor);
    }
}

然后,您需要为dataManipulation方法提供工厂......

public void dataManipulation(ArrayList<CursorContainer> list, CursorContainerFactory factory, Cursor cursor){
    cursor.moveToFirst();
    for (int i = 0; i < cursor.getCount(); i++) {
        list(factory.create(cursor));
        if (!cursor.isAfterLast())
            cursor.moveToNext();

}

最后,称之为......

dataManipulation(listA, new CursorContainerAFactory(), cursor);

请记住,类可以实现许多接口,但只能从一个接口...

答案 1 :(得分:2)

您需要为每个类(A,B,C)创建一个接口来实现。

请参阅:https://docs.oracle.com/javase/tutorial/java/concepts/interface.html

答案 2 :(得分:1)

您可以使用反射,但由于类型擦除,您需要传入Class。像,

public <T> void dataManipulation(Class<T> cls, ArrayList<T> list,
        Cursor cursor) {
    cursor.moveToFirst();
    for (int i = 0; i < cursor.getCount(); i++) {
        Constructor<T>[] ctors = (Constructor<T>[]) cls.getConstructors();
        for (Constructor<T> c : ctors) {
            Type[] types = c.getGenericParameterTypes();
            if (types.length == 1) {
                if (types[0].getClass().equals(Cursor.class)) {
                    list.add(c.newInstance(cursor));
                    break;
                }
            }
        }
        if (!cursor.isAfterLast()) {
            cursor.moveToNext();
        }
    }
}