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

参考文献:

posted @ 2021-08-03 14:14  小烽  阅读(225)  评论(0)    收藏  举报