[英]Java instanceof doesn't work in my case
我有以下類繼承結構:
public class Document {}
public class AuditProgramDocument extends Document {}
public class CaseFilePart {
private Document document;
public Document getDocument() {
return document;
}
}
public class MyClass {
public boolean canDeleteDocument(CaseFilePart selectedCFP) {
...//somelogic
if (selectedCFP.getDocument() instanceof AuditProgramDocument) {
System.out.println("instance");
}
}
}
在調試器中,我清楚地看到, selectedCFP.getDocument()
返回AuditProgramDocument
。 但是If
語句沒有評估。
我的測試:
System.out.println("2.1 " + selectedCFP.getDocument().getClassName());
System.out.println("2.2 " + selectedCFP.getDocument().getClass().getName());
System.out.println("2.3 " + selectedCFP.getDocument().getClass().getCanonicalName());
System.out.println("2.4 " + selectedCFP.getDocument().getClass().getSimpleName());
結果輸出:
2.1 auditProgramDocument
2.2 eu.erp.crams.cmg.bom.document.Document $$ _ javassist_79_
2.3 eu.erp.crams.cmg.bom.document.Document $$ _ javassist_79_
2.4文檔 $$ _ javassist_79_
所以,確保我們有以下規則:
AuditProgramDocument
是 Document
CaseFilePart
有 Document
當我們編寫代碼時:
Document document = new AuditProgramDocument();
if (document instanceof Document) //true
if (document instanceof AuditProgramDocument) //true
但是,當我們編寫代碼時:
Document document = someVar.getDocument();
if (document instanceof Document) //true
if (document instanceof AuditProgramDocuemtn) //false
最后一個語句是false
因為Document
不是 AuditProgramDocument
。 因為getDocument()
方法總是返回我們對Document
引用,而不是子類型
1) - :在CaseFilePart類中,您創建Document類的引用變量而不是文檔類的對象。
你應該返回Document類的對象而不是引用。
2) - :AuditProgramDocument類是Document類的子類,我們無法向下轉換它。
3) - :這就是為什么selectedCFP.getDocument()不是auditProgramDocument的實例
試試這段代碼......(注釋掉了,但包含了你原來的測試)
public class MyClass {
public boolean canDeleteDocument(Document doc) {
return (doc instanceof AuditProgramDocument);
}
public static void main(String[] args) {
//System.out.println("2.1 " + selectedCFP.getDocument().getClassName());//DOES NOT COMPILE
//Not sure about these tests....
//System.out.println("2.2 " + selectedCFP.getDocument().getClass().getName());
//System.out.println("2.3 " + selectedCFP.getDocument().getClass().getCanonicalName());
//System.out.println("2.4 " + selectedCFP.getDocument().getClass().getSimpleName());
MyClass mc = new MyClass();
CaseFilePart cfp = new CaseFilePart();
//TEST 1
cfp.setDocument(new AuditProgramDocument());
boolean canDelete = mc.canDeleteDocument(cfp.getDocument());
System.out.println("Can we delete " + cfp.getDocument().getClass() + " " + canDelete);
//TEST 2
cfp.setDocument(new SomeOtherDocument());
canDelete = mc.canDeleteDocument(cfp.getDocument());
System.out.println("Can we delete " + cfp.getDocument().getClass() + " " + canDelete);
}
}
//Put all these in the same file to simplify the answer
class Document {}
class AuditProgramDocument extends Document {}
//Created 2nd Document implementation for illustration
class SomeOtherDocument extends Document {}
class CaseFilePart {
private Document document;
public Document getDocument() {
return document;
}
public void setDocument(Document document) {
this.document = document;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.