java - 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<>();
但无法更进一步..
解决方案
你的开头是对的: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";
}
}
推荐阅读
- git - 尝试初始化合并请求源时,Repo init 失败
- python - 如何比较字典值和熊猫数据框?
- android - 如何处理android单活动设计模式中的片段?
- date - 在 oracle 中为选择查询结果日期添加天数
- c - scanf("%d/%d%c%d/%d", &num1, &denom1, &sign, &num2, &denom2); 继续在控制台扫描用户输入
- flutter - 如何获得未来的权利
>> 在颤振中? - java - Java - 字符串拆分
- apache-kafka - Flink Kafka Sink org.apache.kafka.common.errors.UnsupportedVersionException ERROR
- performance - 如何计算网速?
- javascript - 如何使用 redux-toolkit 中的 createSlice 方法在不同的 reducer 函数中使用单个动作类型