【问题标题】:Check if some object is instance of some class in a list检查某个对象是否是列表中某个类的实例
【发布时间】:2019-06-23 11:10:34
【问题描述】:

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

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

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

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

或与List&lt;Class&gt; 或类似的东西相同

这显然不起作用,但我不知道最好的方法是什么。当然,我可以硬编码每个我想检查的对象,但这似乎不是那么优雅。

【问题讨论】:

  • 为什么你的类型列表是Object而不是ClassClass 有一个 isInstance 方法,它与 instanceof 完全一样。
  • 这种结构几乎总是带有“代码味道”,而且通常有更好、更简洁的方法来实现您想要的最终结果。您可能希望更多地了解此最终结果的细节,而不是您尝试如何实现它。

标签: java


【解决方案1】:

来自 Java 文档:

在 Java 中,Class 类的实例表示正在运行的 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
    }
}

【讨论】:

    【解决方案2】:

    这些类型的要求需要使用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

    【讨论】:

    • ==typeinstanceof相同。当您的对象与类具有 is_a 关系时,instanceof 运算符返回 true - 也就是说,如果它是子类或子类的子类,它仍然返回 true。
    • michalk's (and RealSkeptic's) isInstance 在这里更有意义。
    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 2012-11-12
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2016-11-01
    相关资源
    最近更新 更多