考虑这些虚假类:
A.java
public class A {
//
// implementation...
//
}
B.java
public class B extends A {
private Long id;
public Long getId() {
return id;
};
//
// B specific implementation...
//
}
C.java
public class C extends A {
private Long id;
public Long getId() {
return id;
};
//
// C specific implementation...
//
}
D.java
public class D extends A {
private Long id;
public Long getId() {
return id;
};
//
// D specific implementation...
//
}
E.java
public class E extends A {
//
// E specific implementation...
//
}
考虑一下您无法更改这些实现的情况,并且您有一个字段A a
,它将包含 B , C 或 D 当然不会出现a
持有 A 类型的对象, E 的情况。
从视觉上讲,访问方法getId()
的方式是否比:
if (B.class.isInstance(a)) {
return (Long) ((B) event).getId();
} else if (C.class.isInstance(a)) {
return (Long) ((C) event).getId();
} else {
return (Long) ((D) event).getId();
}
我知道这是不可能的,但是这样的事情:
public class X extends B, C, D {
public Long getId() {
return super.getId();
}
}
答案 0 :(得分:1)
我会在这里使用一些界面:
interface HasId {
Long getId();
}
以及实现它的一些自定义B,C,D等:
class YourB extends B implements HasId {
// nothing
}
class YourC extends C implements HasId {
// nothing
}
// ...
然后有问题的 if
变为
if (a instanceof HasId) {
return ((HasId) a).getId();
}