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

Java generics - iterating through list of uninstantiated classes extending from same parent and call parent method

我有一个 class 的列表,扩展了一个基数 class

public class Entity{
abstract String getTitle();
}

childclass是

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;;
    }
}

现在我正在尝试将有效 classes 的列表传递给函数 它从列表中的 classes 之一创建一个实例,returns 它

    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;
    }

我试过了 列表> classes = new ArrayList<>();

但无法更进一步..

你的开头是对的:实体的子class列表是:

    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)) {
           ...

如果您不想 to/need 为实体 class 做任何特殊的事情,您可以将其设为通用的。

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

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

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