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

4

4 回答 4

8

只需创建一个通用接口并让 MyClassA 和 MyClassB 实现它:

interface MyClass {
    void abc();
}
于 2013-06-20T22:04:49.840 回答
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) {
   ...
}

如果您只想遍历包含 and 实例的集合MyClassA,则在这些实例上MyClassB调用该方法。abc()这可以很好地工作,JPA因为有一个名为MappedSuperclass的注释。

这样,您可以以符合您的要求并且可以与泛型一起使用的方式从后代类中分解相同的逻辑。这是一个如何使用的 Hibernate 示例

于 2013-06-20T22:34:20.547 回答
0

类型信息可以作为参数传入

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

更好的解决方案可能是在传入之前将 a 转换List<MyClassX>为 aList<Abc>

interface ABC
    abc()

void method(List<Abc> list)

在 java8 中转换可能会很容易

List<MyClassA> list1 = ...
method( list1.map( e->e.abc() ) );
于 2013-06-20T22:26:01.100 回答
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代表其他东西。)

于 2013-06-20T22:07:19.710 回答