将对象数组中的对象动态转换为枚举中可用的相应 类

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