首页 > 解决方案 > 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<? 扩展实体>> 类 = 新的 ArrayList<>();

但无法更进一步..

标签: javaandroidclassgenericsgson

解决方案


你的开头是对的: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) {
        if (getTitle(itemClass).equals(key)) {
           ...

如果您不想/不需要为 Entity 类做任何特别的事情,您可以将其设为通用。

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

TITLE要从子实体类中提取静态字段的值,您可以使用:

private String getTitle(Class<?> itemclass) {
    try {
        return (String) itemclass.getField("TITLE").get(null);
    } catch (IllegalAccessException | NoSuchFieldException e) {
        return "N/A";
    }
}

推荐阅读