簡體   English   中英

Java instanceof在我的情況下不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM