我有以下类继承结构:
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
的引用,而不是子类型
关于Java instanceof 在我的情况下不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37789460/