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";
}
}
我有一个 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;
}
我试过了
列表
但无法更进一步..
你的开头是对的:实体的子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";
}
}