提问者:小点点

Java泛型-遍历从相同父级扩展的未实例化类列表并调用父级方法


我有一个扩展基类类列表

public class Entity{
abstract String getTitle();
}

类的孩子

public class ChildEntityOne extends Entity{

    public static final String TITLE= "ABCD";

    @Override
    public String getTitle() {
        return TITLE;;
    }

}
public class ChildEntityTwo extends Entity{

    public static final String TITLE= "EFGH";

    @Override
    public String getTitle() {
        return TITLE;;
    }

}
public class ChildEntityThree extends Entity{

    public static final String TITLE= "WXYZ";

    @Override
    public String getTitle() {
        return TITLE;;
    }
}

现在我尝试将一个有效类列表传递给一个函数,该函数从类列表中的一个创建一个实例并返回它

    List<?ClassesToChooseFrom?> list = new ArrayList()<>;
    list.add(?ChildEntityOne?);
    list.add(?ChildEntityTwo?);
    
    Entity result = getInstantiatedClass(list,getKey(),getjsonData())
    if(result instanceof ChildEntityOne){
     //do something
    }else if(result instanceof ChildEntityTwo){
     //do somwthing
    }
    
    
    public ?InstantiatedClassObject? getInstantiatedClass(List<?ClassesToChooseFrom?> list,String key,String jsonData){
      foreach(?Class? itemclass : list){
         if(itemClass.getTitle().equals(key)){
return new GsonBuilder().create().fromJson(jsonData, itemClass);}
    }
    return null;
    }

我试过List<;Class<;? 扩展实体>>>; 类=新数组列表();

但不能走得更远。


共1个答案

匿名用户

开头是对的:Entity的子类列表是:

    List<Class<? extends Entity>> list = new ArrayList<>();
    list.add(ChildEntityOne.class);
    list.add(ChildEntityTwo.class);

然后您只需要使GetInstantiatedClass使用您传递给它的相同类型:

public Entity getInstantiatedClass(List<Class<? extends Entity>> list, String key, String jsonData) {
    for (Class<? extends Entity> itemclass : list) {
        ...

如果您不想/不需要为实体类做任何特殊的事情,那么可以使它成为通用的。

public <T> T getInstantiatedClass(List<Class<? extends T>> list, String key, String jsonData) {
    for (Class<? extends T> itemclass : list) {
        ...