Java instanceof在我的案例中不起作用

时间:2016-06-13 12:07:19

标签: java instanceof

我有以下类继承结构:

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_

3 个答案:

答案 0 :(得分:3)

所以,确保我们有以下规则:

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 :(得分:0)

1) - :在CaseFilePart类中,您创建Document类的引用变量而不是文档类的对象。

你应该返回Document类的对象而不是引用。

2) - :AuditProgramDocument类是Document类的子类,我们无法向下转换它。

3) - :这就是为什么selectedCFP.getDocument()不是auditofTrogramDocument的实例

答案 2 :(得分:0)

尝试此代码...(已注释掉,但包括原始测试)

Gradle 'myapp' project refresh failed
Error:No toolchains found in the NDK toolchains folder for ABI with prefix: aarch64-linux-android