接受两种类型List的通用方法

时间:2013-06-20 22:02:27

标签: java list generics methods

我想编写一个可以接受两种相似类型的函数。但不一样。

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

4 个答案:

答案 0 :(得分:8)

只需创建一个通用界面,让MyClassA和MyClassB实现它:

interface MyClass {
    void abc();
}

答案 1 :(得分: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) {
   ...
}

如果您只想迭代包含MyClassAMyClassB实例的集合,请在这些实例上调用方法abc()。 这可以与JPA一起使用,因为有一个注释所谓的MappedSuperclass

通过这种方式,您可以以符合您要求的方式从后代类中分解相同的逻辑,并且可以与泛型一起使用。这是how to use

的Hibernate示例

答案 2 :(得分: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代表别的东西。)

答案 3 :(得分: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() ) );