创建静态嵌套类的列表作为通用列表

时间:2015-09-18 14:10:12

标签: java list generics static nested-class

我需要创建并返回静态嵌套类对象的通用列表。

例如:

如果有一个类Outer包含静态嵌套类作为InnerOne / Two / Three等等......使用自己的成员和方法。

我正在尝试通过Factory类创建和检索它们的实例。

我该怎么做?

我应该如何声明和定义我的" genericList"如下面的代码所示。

所以以后我可以" typecast"列表通过使用" instanceof"对象到各自的类对象。运营商并呼吁他们各自超负荷运营#34;功能 ??

public class Outer{

    public static class InnerOne{
        //members and methods
    };

    public static class InnerTwo{
        //members and methods
    };

    public static class InnerThree{
        //members and methods
    };
}

public class factory{

    public static List<?> getInstanceList(List<String> instancetypes){
        List<?> genericList = new ArrayList<>();
        for(String instanceType : instancetypes){
            if(instanceType.equals("InnerOne")){
                genericList.add(new InnerOne());
            }
            else if(instanceType.equals("InnerTwo")){   
                genericList.add(new InnerTwo());
            }else{
                genericList.add(new InnerThree());
            }
        }
         return genericList;
    }
}

2 个答案:

答案 0 :(得分:0)

首先,我在这里看不到通用,因为内部类不共享共同的祖先(除了Object),并且没有什么可以使方法通用。其次,您的方法需要return类型。像,

public static List<Object> getInstanceList(List<String> instancetypes){
    List<Object> genericList = new ArrayList<>();
    // ...
    return genericList;
}

您可以在instanceof上使用Object;然后类型转换为正确的类型。我希望您编程到一个公共接口并返回该类型的List。但你可以做类似

的事情
for (Object obj : genericList) {
    if (obj instanceof InnerOne) {
        InnerOne one = (InnerOne) obj;
    }
}

答案 1 :(得分:0)

您可以制作genericList类型的List<Object>,这样您就可以在列表中添加任何内容。如果你想访问内部类中定义的成员或方法,你必须输入它们(如你所说)。

如果内部类有任何共同点,你可以将它提取到超类:

public class Outer{

    public abstract static class InnerSuper{
        public abstract void method();
    };

    public static class InnerOne extends InnerSuper{
        //members and methods

        @Override
        public void method(){
            System.out.println("InnerOne.method()");
        }
    };

    public static class InnerTwo extends InnerSuper{
        //members and methods

        @Override
        public void method(){
            System.out.println("InnerTwo.method()");
        }
    };

    public static class InnerThree extends InnerSuper{
        //members and methods

        @Override
        public void method(){
            System.out.println("InnerThree.method()");
        }
    };
}

public class factory{

    public static List<InnerSuper> getInstanceList(List<String> instancetypes){
        List<InnerSuper> genericList = new ArrayList<>();
        for(String instanceType : instancetypes){
            if(instanceType.equals("InnerOne")){
                genericList.add(new InnerOne());
            }
            else if(instanceType.equals("InnerTwo")){   
                genericList.add(new InnerTwo());
            }else{
                genericList.add(new InnerThree());
            }
        }
        return genericList;
    }
}

在这种情况下,genericList的类型为List<InnerSuper>。如果您现在想要拨打method(),可以按照以下方式拨打电话:

List<String> instanceTypes = new ArrayList<>();
instanceTypes.add("InnerTwo");
instanceTypes.add("InnerOne");
List<InnerSuper> instances = factory.getInstanceList(instanceTypes);
instances.get(0).method();

此代码将提供以下输出:

InnerTwo.method()