【问题标题】:Java generics - iterating through list of uninstantiated classes extending from same parent and call parent methodJava泛型 - 遍历从相同父级扩展的未实例化类列表并调用父级方法
【发布时间】:2020-07-05 14:11:28
【问题描述】:

我有一个扩展基类的类列表

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

我试过了 列表> 类 = 新的 ArrayList();

但无法走得更远..

【问题讨论】:

    标签: java android class generics gson


    【解决方案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) {
            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";
        }
    }
    

    【讨论】:

    • 这只是一半正确的实现。我不能在 foreach 循环中使用 itemClass.getTitle()
    • Class 中没有 getTitle() 方法。不知道你想拿什么来比较。也许你想要getName()getSimpleName()?可用于 Class 的方法在docs.oracle.com/javase/8/docs/api/java/lang/Class.html 中列出
    • 哦,我看到你的“子实体”类每个都有一个 TITLE 字段,这是你想要比较的吗?
    • 是的。我想将键与具有自己独特标题的类列表进行比较
    猜你喜欢
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2017-11-11
    • 2021-02-19
    • 2015-12-08
    • 1970-01-01
    相关资源
    最近更新 更多