将对象数组中的对象动态转换为枚举中可用的相应 类
Dynamic casting objects from object array to the respective classes available in an enumeration
public class A {
private String property;
public String getProperty() {
return property;
}
}
public class B {
private String property;
public String getProperty() {
return property;
}
}
类似地类定义了C和D。(省略其他逻辑和复杂度)
然后创建了这些 class 名称的枚举。[简单的 class 名称或规范的 class 名称我可以毫无问题地添加]
public enum ClassNameEnum{ A, B, C, D }
在另一个 class 中,我有一个对象数组,其中包含枚举中任何 classes 的实例。
我的Objective:
获取对象数组中的每个元素,将它们转换为 myEnum 中的 classe 名称之一并执行方法调用。
到目前为止我做了什么。
(1) 遍历对象数组并有 if else 梯形图来检查 instanceof。如果匹配,cast和do操作[工作但丑陋]
(2) 改进:
public class ImplClass {
public static void main(String[] args)
{
List<Object> objectList = new ArrayList<Object>();
objectList.add(new B());
objectList.add(new D());
objectList.add(new A());
for (Object object : objectList) {
Arrays.asList(ClassNameEnum.values()).stream()
.filter(e -> obj instanceof e) // Error here: e cannot be resolved to a type
.map(e -> (e)obj)
.map("Call getProperty() on the casted object and return the string"); // This is what I want to do
}
}
}
提前致谢
既然您想从所有对象调用一个通用方法,那么在这里创建一个接口是有意义的。
public interface Property {
String getProperty();
}
在你的class中:
public class A implement Property {
private String property;
@Override
public String getProperty() {
return property;
}
}
尝试通过接口引用来存储您的对象:
List<Property> objectList = new ArrayList<>();
objectList.add(new A());
objectList.add(new B());
...
最后:
objectList.forEach(o -> System.out.println(o.getProperty()));
您可以将 类 存储到如下结构中,而不是枚举:
class ClassInfo<T> {
private final Class<T> clazz;
private final Function<T, String> function;
// all args constructor here
String castAndApply(Object obj) {
return function.apply(clazz.cast(obj));
}
}
然后创建地图,例如:
Map<Class, ClassInfo> classInfos = Map.of(
A.class, new ClassInfo<>(A.class, A::getA),
B.class, new ClassInfo<>(B.class, B::getB),
C.class, new ClassInfo<>(C.class, C::getProperty)
);
下面是用法:
objectList.stream()
.filter(obj -> classInfos.containsKey(obj.getClass()))
.map(obj -> classInfos.get(obj.getClass()).castAndApply(obj))
.forEach(System.out::println);
public class A {
private String property;
public String getProperty() {
return property;
}
}
public class B {
private String property;
public String getProperty() {
return property;
}
}
类似地类定义了C和D。(省略其他逻辑和复杂度)
然后创建了这些 class 名称的枚举。[简单的 class 名称或规范的 class 名称我可以毫无问题地添加]
public enum ClassNameEnum{ A, B, C, D }
在另一个 class 中,我有一个对象数组,其中包含枚举中任何 classes 的实例。
我的Objective: 获取对象数组中的每个元素,将它们转换为 myEnum 中的 classe 名称之一并执行方法调用。
到目前为止我做了什么。 (1) 遍历对象数组并有 if else 梯形图来检查 instanceof。如果匹配,cast和do操作[工作但丑陋]
(2) 改进:
public class ImplClass {
public static void main(String[] args)
{
List<Object> objectList = new ArrayList<Object>();
objectList.add(new B());
objectList.add(new D());
objectList.add(new A());
for (Object object : objectList) {
Arrays.asList(ClassNameEnum.values()).stream()
.filter(e -> obj instanceof e) // Error here: e cannot be resolved to a type
.map(e -> (e)obj)
.map("Call getProperty() on the casted object and return the string"); // This is what I want to do
}
}
}
提前致谢
既然您想从所有对象调用一个通用方法,那么在这里创建一个接口是有意义的。
public interface Property {
String getProperty();
}
在你的class中:
public class A implement Property {
private String property;
@Override
public String getProperty() {
return property;
}
}
尝试通过接口引用来存储您的对象:
List<Property> objectList = new ArrayList<>();
objectList.add(new A());
objectList.add(new B());
...
最后:
objectList.forEach(o -> System.out.println(o.getProperty()));
您可以将 类 存储到如下结构中,而不是枚举:
class ClassInfo<T> {
private final Class<T> clazz;
private final Function<T, String> function;
// all args constructor here
String castAndApply(Object obj) {
return function.apply(clazz.cast(obj));
}
}
然后创建地图,例如:
Map<Class, ClassInfo> classInfos = Map.of(
A.class, new ClassInfo<>(A.class, A::getA),
B.class, new ClassInfo<>(B.class, B::getB),
C.class, new ClassInfo<>(C.class, C::getProperty)
);
下面是用法:
objectList.stream()
.filter(obj -> classInfos.containsKey(obj.getClass()))
.map(obj -> classInfos.get(obj.getClass()).castAndApply(obj))
.forEach(System.out::println);