Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接受两种类型列表的泛型方法_Java_List_Generics_Methods - Fatal编程技术网

Java 接受两种类型列表的泛型方法

Java 接受两种类型列表的泛型方法,java,list,generics,methods,Java,List,Generics,Methods,我想写一个可以接受两种相似类型的函数。但不一样 MyClassA { abc() a2b() } MyClassB { abc() a3b() } 这两种方法中有一种是相同的。函数应该接受这两种类型中任何一种的列表,我想对列表中的对象调用abc 这似乎无助于: private <T> Set<MyclassX> createObject(List<T> classes) { Set<MyclassX&

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

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

只需创建一个公共接口并使MyClassA和MyClassB实现它:

interface MyClass {
    void abc();
}

使用泛型,可以执行以下操作:

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代表其他东西。

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

<T> void method(Class<T> clazz, List<T> list)
{             
    if(clazz==MyClassA.class)
    {
        @SuppressWarnings("unchecked)
        List<MyClassA> listA = (List<MyClassA>)list;
        ....
    }
    else if...
更好的解决方案可能是在传递列表之前将其转换为列表

interface ABC
    abc()

void method(List<Abc> list)
在java8中,转换可能会很容易

List<MyClassA> list1 = ...
method( list1.map( e->e.abc() ) );
我建议您使用如下抽象超类:

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,因为有一个所谓的注释


通过这种方式,您可以从子类中以一种适合您的需求并可用于泛型的方式分解相同的逻辑。下面是一个Hibernate示例,说明编译和运行代码时会发生什么?您是否有任何错误?同时请显示is t的声明?以及两个类中方法的返回类型。实际上,我正在尝试编写两个方法。但eclipse显示两者实际上是相同的。是的,两种方法都接受不同类型的列表。但是清单。因此它不允许。两者都返回相同的MyClassXHMM。。这两个是@Entity的。所以我不想这样做。或者制作一个抽象的超类,你可以用@Entity来做,只要看一看,请编辑你的问题,显示抽象类的解决方案。如果你不能修改类,那么泛型就不适合你的情况,因为你没有任何共同点。要执行您建议的操作,您只需使用class对象,然后检查instanceof,就像您已经在做的一样。但是如果你的对象只是实体,为什么你在其中有一些逻辑呢?或者abc只是一个获得者?如果是这样的话,我会同意@KevinRave提出的解决方案。@nachokk这只是一个例子。关注主要问题。呃,不。。。你不能。因为t的含义没有限定词,所以它确实有一个方法ABC,而且对象当然没有那个方法。GAH……我经常会把java泛型与C++模板混合在一起;如果不使用从抽象基派生的接口或类,则必须在列表中迭代,将每个对象作为T实例或实际上是对象,并检查它是否是某个对象的实例,然后将其强制转换。“这真的是在指出一个糟糕的设计。@BrianRoach你能用你的解决方案写一个答案吗?”?