我需要创建并返回静态嵌套类对象的通用列表。
例如:
如果有一个类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;
}
}
答案 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()