用于迭代不相关对象的Java泛型方法

时间:2014-02-04 12:15:43

标签: java generics

我想为迭代编写通用代码,如下所示:

  public ClassA assemlbyClassA(ClassC c) {
    Set<ClassB> classBElements = c.getClassBElements();
    ClassA result = new ClassA();
    if (classBElements != null && classBElements.size() > 0) {            
        for (ClassB classB : classBelements) {                
            ClassD classD = new ClassD();
            classD.setMethod1(classB.callMethod1());                    
            classD.setMethod2(classB.callMethod2());
            result.add(classD);
        }
    }
    return result;
}

A,B,C,D类彼此不相关。 我想知道是否可能以及简单的解决方案是否存在?

1 个答案:

答案 0 :(得分:0)

有可能:有点儿! 'new GenericClass()'是不可能的,因此必须更换。

(或者,请参阅Create instance of generic type in Java?。)

“存在简单的解决方案”:嗯,这就是“简单”对你意味着什么。

这是一种方法,您可以将其复制并粘贴到一个部分中:

interface StackoverflowAnswer {
    public interface ClassABase<ClassD> {
        void add(ClassD value);
    }
    public interface ClassBBase<X1, X2> {
        X1 callMethod1();
        X2 callMethod2();
    }
    public interface ClassCBase<ClassB> {
        Set<ClassB> getClassBElements();
    }
    public interface ClassDBase<X1, X2> {
        void setMethod1(X1 value);
        void setMethod2(X2 value);
    }

    public static abstract class Z<X1, X2, 
            ClassA extends ClassABase<ClassD>, 
            ClassB extends ClassBBase<X1, X2>, 
            ClassC extends ClassCBase<ClassB>, 
            ClassD extends ClassDBase<X1, X2>> {

        protected abstract ClassA newClassA();

        protected abstract ClassD newClassD();

        public ClassA assemlbyClassA(ClassC c) {
            Set<ClassB> classBElements = c.getClassBElements();
            ClassA result = newClassA();
            if (classBElements != null && classBElements.size() > 0) {
                for (ClassB classB : classBElements) {
                    ClassD classD = newClassD();
                    classD.setMethod1(classB.callMethod1());
                    classD.setMethod2(classB.callMethod2());
                    result.add(classD);
                }
            }
            return result;
        }
    }
}