检查某个对象是否是列表中某个类的实例

时间:2019-06-23 11:10:34

标签: java

因此,我想要一个类型列表,然后遍历该列表并检查对象是否是该列表中类型的实例。

这就是我想象的那样,但是那不是Java语法。 Type1.class也不起作用

List<Object> types = new ArrayList();
types.add(Type1);
types.add(Type2);

for (Object type : types) {
    if (someObject instanceof type) {
        doSomething();
    }
}

或与List<Class>相同或类似的东西

这显然行不通,但是我不知道什么是最好的方法。当然,我可以对每个要检查的对象进行硬编码,但这看起来并不那么优雅。

2 个答案:

答案 0 :(得分:5)

来自Java文档:

  

Class类的Java实例中,代表正在运行的Java应用程序中的类和接口。

您可以使用Class::isInstance方法来确定对象是否为给定类型的实例,然后根据此评估结果进行处理:

List<Class<?>> types = new ArrayList<>();
types.add(String.class);
types.add(Integer.class);

String someObject = "someString";

for (Class<?> type : types) {
    if (type.isInstance(someObject)) {
         // do smoething
    }
}

答案 1 :(得分:1)

这些要求要求使用reflection。 Java中有一个用于表示对象类型的类:类Class。该类的实例有效地表示了对象的类型。因此,您可以这样做:

List<Class<?>> types = new ArrayList<>();
types.add(Type1.class);
types.add(Type2.class);

for (Class<?> type : types) {
    if (type.isAssignableFrom(someObject.getClass())) {
        doSomething();
    }
}

请注意,在这种情况下,重要的是要知道您是否要检查目标对象与列表中的类型是否具有完全相同的类型或是否可以分配 >到列表中的类型。该代码示例涵盖了第二个选项,因为它更接近原始意图。如果您需要完全匹配,则可以执行以下操作:

object.getClass() == type;

另请参阅Class.isInstance vs Class.isAssignableFrom