2013-06-20 4 views
0

Я хочу написать функцию, которая может принимать два похожих типа. Но не то же самое.Общий метод, который принимает два типа списка

MyClassA { 
    abc() 
    a2b() 
} 

MyClassB { 
    abc() 
    a3b() 
} 

Один метод в этих двух. Функция должна принимать список любого из этих двух типов, и я хочу вызывать abc() для объектов в списке.

Это не похоже, чтобы помочь:

private <T> Set<MyclassX> createObject(List<T> classes) { 

      Set<MyclassX> x; 

      if (T instanceof MyClassA) { 
       for (MyClassA a : classes) { 
        if (a.abc().equals("somethig")) { 
         x.add(t.abc()); 
        } 
       } 
      } 
      return x; 
    } 

Я даже не нужно проверять instanceof. Мне просто нужно перебирать список и сравнивать значения. если есть совпадение, а затем вызвать метод abc()

+0

Что происходит, когда вы компилируете и запускаете свой код? Вы получаете какие-либо ошибки? –

+0

Также, пожалуйста, покажите декларацию для 't'? –

+0

И каковы типы возвращаемых методов в ваших двух классах. –

ответ

8

Просто создайте общий интерфейс и сделать MyClassA и MyClassB его реализации:

interface MyClass { 
    void abc(); 
} 
+0

Хмммм .. эти два являются @ Entity's. Поэтому я не хочу этого делать. –

+1

Или сделайте абстрактный суперкласс, вы можете сделать это с помощью @Entity, просто взгляните на [сопоставленный суперкласс] (http: // stackoverflow.com/questions/4265454/hibernate-jpa-inheritance-mapping-of-abstract-super-classes) – Quirin

+0

Измените свой вопрос, показывая решение класса abstract. –

0

Использование дженериков, вы можете сделать это:

private <T> Set<MyclassX> createObject(List<T> classes) { 
    Set<MyclassX> x; 
    for (T a : classes) { 
     if (a.abc().equals("somethig")) { 
      x.add(t.abc()); 
     } 
    } 
} 
return x; 
} 

Предполагая, что t.abc() возвращает MyclassX. (И я имею в виду это буквально, я не предполагая, что X стоит что-то другое.)

+1

Эмм, нет ... ты не можешь. Потому что нет никакого классификатора вокруг 'T' (это означает, что это действительно' '), который говорит, что у него есть метод' abc() ', и' Object', конечно же, не имеет этого метода. –

+0

gah ... Я получаю Java-генераторы, смешанные с шаблонами C++ слишком часто ;-( –

+1

Без использования интерфейса или классов, полученных из абстрактной базы, вам придется перебирать список, получая каждую вещь как экземпляр T (или действительно , так же как и объект) и проверить, является ли это «экземпляром» что-то, а затем бросить его, что действительно указывает на плохой дизайн. –

0

Тип информация может быть передана в качестве аргумента

<T> void method(Class<T> clazz, List<T> list) 
{    
    if(clazz==MyClassA.class) 
    { 
     @SuppressWarnings("unchecked) 
     List<MyClassA> listA = (List<MyClassA>)list; 
     .... 
    } 
    else if... 

Лучшее решение, вероятно, чтобы преобразовать List<MyClassX> к List<Abc> перед передачей его в

interface ABC 
    abc() 

void method(List<Abc> list) 

преобразование, вероятно, будет легко в java8

List<MyClassA> list1 = ... 
method(list1.map(e->e.abc())); 
1

Я предлагаю вам использовать abstract super class вроде этого:

abstract SuperClass{ 
    abc(); 
    abstract ab(); // Only if the other methods share signatures 
} 

MyClassA extends SuperClass { 
    ab(); 
} 

MyClassB extends SuperClass{ 
    ab(); 
} 

private <T> Set<? extends SuperClass> createObject(List<T> classes) { 
    ... 
} 

Если вы хотите перебрать коллекцию, содержащую экземпляры MyClassA и MyClassB, а затем вызвать метод abc() на тех случаях. Это может хорошо работать с JPA потому что есть аннотация, так называемая MappedSuperclass.

Таким образом, вы можете разложить одну и ту же логику из классов потомков таким образом, который соответствует вашим требованиям и может использоваться с дженериками. Вот пример спящего режима: how to use