【问题标题】:Compare object with class stored in field将对象与存储在字段中的类进行比较
【发布时间】:2014-07-10 12:58:29
【问题描述】:

我正在尝试将 part 与构造函数给出的 c 类进行比较,但由于某种原因,我的 IDE 会弹出一个警告,它总是错误的。

Class<? extends Part> c;

public Slot(Class<? extends Part> c){
    this.c = c;
}

public boolean addItem(Part part){
    return part instanceof c;
}

为什么这个 instanceof 语句总是错误的?比较 partc 的正确语法是什么?

【问题讨论】:

  • c 不是Part 而是Class&lt;Part&gt; 所以Part != Class&lt;Part&gt;
  • @gtgaxiola 以及将part 与保存在字段中的类进行比较的正确语法是什么?
  • @Fabien Fleureau 已经回答了
  • @Nick - 现在你的问题没有意义!您更改了代码,使其与下面的文本不匹配。请将其退回,以便问题保持一致。
  • @HonzaZidek 哎呀抱歉更新了代码以修复 extends Part 部分,忘记了我正在尝试答案中的代码,已修复。

标签: java class


【解决方案1】:

你应该调用下面的 Class 方法:

Class.isInstance(Object obj)

当你调用“instanceof c”时,“c”应该是一个类,而不是一个变量。在您的示例中,c 是一个类型为 Class 的变量。

【讨论】:

    【解决方案2】:

    不是这个

    if(part instanceof c) return true;
    

    试试这个

    if(c.isAssignableFrom(part.getClass())) return true;
    

    这是different than Class.isInstance(Object),因为当partc 的子类相同时,isAssignableFrom 也会返回 true。

    因此,如果您需要知道这是否是完全相同的类型,请使用isInstance,如果它也可以是子类,请使用isAssignableFrom

    【讨论】:

    • 哦。 c 是一个。我没听懂。
    • 它的 classObject.isAssignableFrom 不是 object。所以如果我没记错的话应该是c.isAssignableFrom(part.getClass())
    【解决方案3】:

    这是关于理解运算符instanceofClass 类。

    类型比较运算符instanceof

    在运行时,instanceof 运算符的结果是 true,如果 RelationalExpression 的值不是 null 并且引用可以 在不引发ClassCastException 的情况下转换为ReferenceType。 否则结果为false

    这意味着您的代码 if (part instanceof c) ... 将始终返回 false,因为 part 永远无法转换为 Class

    如果您查看Class.inInstance(Object obj),您会发现

    此方法是 Java 语言 instanceof 运算符的动态等效方法。

    换句话说:

    1. 如果您知道编译时检查的类型,则使用instanceof
    2. 如果您在编译时不知道检查的类型,但在运行时(因此您将其存储在Class 类型的变量中),则使用Class.inInstance(Object obj)

    【讨论】:

      猜你喜欢
      • 2011-08-18
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 2022-09-30
      • 2023-03-12
      相关资源
      最近更新 更多