繁体   English   中英

将对象与字段中存储的类进行比较

[英]Compare object with class stored in field

我正在尝试将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;
}

为什么此ins​​tanceof语句始终为false?将partc比较的正确语法是什么?

您应该调用以下Class方法:

Class.isInstance(Object obj)

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

代替这个

if(part instanceof c) return true;

尝试这个

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

Class.isInstance(Object)不同 ,因为当partc part同一类型属于c的子类时, isAssignableFrom也返回true。

因此,如果您需要使用isInstance确定它是否与类型完全相同 ,如果它也可以是子类,请使用isAssignableFrom

关于理解运算符instanceofClass类。

类型比较运算符instanceof

在运行时,如果RelationalExpression的值不为null并且可以将引用强制转换为ReferenceType而不引发ClassCastException ,则instanceof运算符的结果为true 否则结果为false

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

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

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

换一种说法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM