簡體   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