我这里有两个类ClassA, ClassB的某些字段及其set get方法是一样的
但又不能用继承,但在某个方法上的处理逻辑完全一样,因此我想用泛型
处理,但试验了不行public void genericTest(List<ClassA> testList){//单个ClassA。ClassB逻辑完全和这个一样    for(ClassA cA : testList){
        if(cA.getAge() > 60){
              //......
        }
    }
}
public void genericTest(List<?> testList){//不能生效的泛型应用
    for(Object obj : testList){
        if(obj.getAge() > 60){
              //......
        }
    }
}请问有什么好的方法能够让List<ClassA>,List<ClassB>均在一个方法中处理么?
谢谢!

解决方案 »

  1.   

    import java.util.LinkedList;/**
     *
     * @author simba
     */
    public class Test {
        public static void main(String[] args){
            Test test = new Test();
            LinkedList<MyInterface> lista = new LinkedList<MyInterface>();
            lista.add(new ClassA());
            lista.add(new ClassA());
            test.myprint(lista);
            LinkedList<MyInterface> listb = new LinkedList<MyInterface>();
            listb.add(new ClassB());
            listb.add(new ClassB());
            test.myprint(listb);
        }
        
        void myprint(LinkedList<MyInterface> list){
            for(MyInterface mi : list){
                mi.print();
            }
        }
    }interface MyInterface{
        public void print();
    }class ClassA implements MyInterface{    @Override
        public void print() {
            System.out.println("Class A");
        }
        
    }class ClassB implements MyInterface{    @Override
        public void print() {
            System.out.println("Class B");
        }
        
    }
    输出如下:
    run:
    Class A
    Class A
    Class B
    Class B
    成功生成(总时间:0 秒)
      

  2.   

    接口我也没法用,因为要求不能改动ClassA和ClassB
    有没有其他方法,泛型的话有没有解决的可能
      

  3.   

    public static void main(String[] args) {
    List target = new ArrayList();
    target.add(new ClassA());
    target.add(new ClassB());
    Test t = new Test();
    t.genericTest(target);
    }

    public void genericTest(List<?> testList){
    try{
    for(Object obj : testList){
    Method m = obj.getClass().getDeclaredMethod("getAge");
    if(Integer.valueOf(m.invoke(obj).toString()) > 60){
    System.out.println(obj.getClass().getName()+" gt");
    }
    }
    }catch(Exception e){
    e.printStackTrace();
    }
    }
      

  4.   

    那可以尝试一下LIST定义为OBJECT,获取到实例后,通过 object instanceof CLASSA 这样的形式来判断究竟是那个类的实例,强制转换一下类型
      

  5.   

    public void <T> genericTest(List<T> testList){
        for(T t : testList){
            if(t.getAge() > 60){
                  //......
            }
        }
    }
      

  6.   

    4楼的方法是可以的;for(Object obj : testList){
    try {
    Method m = obj.getClass().getMethod("getAge");
    System.out.println(Integer.valueOf(m.invoke(obj)));
    } catch (Exception e) {
    e.printStackTrace();

    }
    像你这样的需求,个人认为最好是创建两个方法:
    processClassA(List<ClassA> lists);
    processClassB(List<ClassB> lists);
    原因是你在使用已存在的类,而且它们间没有什么关系,虽然方法名相同,处理逻辑相似,但在不同的Class中也许是完全不同的逻辑,将来某个类加个什么字段、方法的,需要修改if(obj.getAge() > 60 && ...),而且只对其中一个适合,那你就方便维护了;
    ClassA和ClassB如果确实是没有什么关联的,最好是分开处理;
    再说反射对于性能的影响是很大的;
      

  7.   

    泛型机制可以用 通配符来替换 List<?> 这样写是可以的,这个里面放任意的。你还可以进行限制 如:List<? extends 某个类>,这样你里面放的数据  就只能是某个类的衍生类叻但是使用通配符 有缺点,就是只能查看,不能对它进行添加操作的。 所以用的比较少。希望对你有所帮助
      

  8.   

    ps:
    可以找一本基本的java书看看那