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()
returns 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_
1)-:在侧 CaseFilePart class 中,您正在创建文档 class 的引用变量,而不是文档 class.
的对象
您应该 return 文档对象 class 而不是引用。
2)-:AuditProgramDocument class 是文档 class 的子 class 我们不能向下转换它。
3)-:这就是为什么 selectedCFP.getDocument() 不是 instanceof AuditProgramDocument
所以,为了确保我们有以下规则:
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()
方法总是 returns 我们引用 Document
,而不是 subtype
尝试此代码...(已注释掉,但包括您的原始测试)
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;
}
}
我有以下类继承结构:
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()
returns 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_
1)-:在侧 CaseFilePart class 中,您正在创建文档 class 的引用变量,而不是文档 class.
的对象您应该 return 文档对象 class 而不是引用。
2)-:AuditProgramDocument class 是文档 class 的子 class 我们不能向下转换它。
3)-:这就是为什么 selectedCFP.getDocument() 不是 instanceof AuditProgramDocument
所以,为了确保我们有以下规则:
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()
方法总是 returns 我们引用 Document
,而不是 subtype
尝试此代码...(已注释掉,但包括您的原始测试)
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;
}
}