簡體   English   中英

Java不同類型的對象作為相同的參數

[英]Java different type objects as same parameter

我目前正在編寫用於操縱多個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);
}

首先看一下接口和繼承 ,基本上一個接口是一個合同,它可以實現任何實現該接口的對象將提供合同功能......

例如...

public interface CursorContainer {
    public Cursor getCursor();
}

您的“普通”類將實現此接口,並提供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);

請記住,類可以實現許多接口,但只能從一個擴展...

您需要為每個類(A,B,C)創建一個接口來實現。

參見以下內容: https : //docs.oracle.com/javase/tutorial/java/concepts/interface.html

您可能使用了反射,但是由於類型擦除,您需要傳遞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();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM