2014-11-28 4 views
2

В настоящее время я пишу функцию для управления несколькими ArrayList.Java-объекты разных типов как один и тот же параметр

Все элементы имеют один и тот же конструктор, как я могу сделать это, как показано ниже?

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

Создайте общий интерфейс для 'A',' B' и 'C' для реализации, который гарантирует совместимость для требуемых функций – MadProgrammer

+0

Спасибо за ответ, вы могли бы показать пример кода? Поскольку я новичок в программировании –

+1

Вы не называете свой пример правильным. Я не уверен, где вы получаете курсор от этого метода 'main' (который не совпадает с' public static void main (String [] args) ', заметьте). Кроме того, что означает 'list (new **? ** (cursor))', предназначенный для представления? – Makoto

ответ

4

Начните с взглянуть на Interfaces and Inheritance, в основном интерфейс представляет собой договор, который gurentees, что любой объект, который реализует этот интерфейс обеспечит договорную функциональность ...

К примеру ...

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); 

Помните, что классы могут реализовывать множество интерфейсов, но только простираться от один ...

+0

Есть ли причина, по которой он не может быть «List '? – Makoto

+0

@Makoto Из памяти, которая не позволит вам добавлять к нему какие-либо объекты ... – MadProgrammer

+0

Если это так, то его можно переместить в «Список '. Я не видел нигде, что мы сначала записывали в список (я * угадаю, что это «список» (новый **? ** (курсор)), а значит, я тоже не вижу, что мы читать из списка. – Makoto

2

Вам необходимо будет создать интерфейс для каждого из ваших классов (A, B, C) для реализации.

Смотреть это: https://docs.oracle.com/javase/tutorial/java/concepts/interface.html

+0

Хмм, а как насчет 'list (new **? ** (cursor));'? – MadProgrammer

+0

Вы можете просто подставить курсор для A, B или C – frgnvola

+0

Но откуда вы знаете, какой из них будет использоваться? – MadProgrammer

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(); 
     } 
    } 
}