Java中instanceof、isInstance、isAssignableFrom 的 认识
在回顾 设计模式之美 篇章中的 EventBus 实现中,发现
//根据 事件类型 匹配 到 订阅者
public List<ObserverAction> getMatchedObserverActions(Object event) {
List<ObserverAction> matchedObservers = new ArrayList<>();
Class<?> postedEventType = event.getClass();
for (Map.Entry<Class<?>, CopyOnWriteArraySet<ObserverAction>> entry : registry.entrySet()) {
Class<?> eventType = entry.getKey();
Collection<ObserverAction> eventActions = entry.getValue();
//类型 包含父类.
if (postedEventType.isAssignableFrom(eventType)) {
matchedObservers.addAll(eventActions);
}
}
return matchedObservers;
}
既然 订阅者中的 参数类型是 父类 类型的 时候,能 同时 订阅到 子类的信息。 是不是有问题?
赶紧验证下!!!
a instanceof A
从 实例 集成的角度 判断。 一个 类的实例 a 是否是 A 的 实例,是 true, 否则 false
System.out.println("hello" instanceof String);//true
System.out.println(new Object() instanceof List);//false
A.class.isInstance(Object a)
同上。
从 实例 集成的角度 判断。 一个 类的实例 a 是否是 A 的 实例, 是 true, 否则 false
System.out.println(String.class.isInstance("1"));//true
System.out.println(List.class.isInstance("1"));//false
isAssignablefrom
A.class.isAssignablefrom(B.class)
从类继承 的 角度 去 判断, 类 A 是否是 类B 的 父类 ,是 true, 否则 false
System.out.println(ArrayList.class.isAssignableFrom(Object.class)); //false
System.out.println(Object.class.isAssignableFrom(ArrayList.class)); //true

浙公网安备 33010602011771号