A instanceof B b 是什么用法

A instanceof B b 是什么用法

阅读最新的spring-framework源码发现其中instanceof的用法很特殊, 比如

original instanceof AbstractBeanDefinition originalAbd

this.beanClass instanceof Class clazz

什么时候instanceof 可以拷贝对象了?还是Java新特性?

public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
        implements BeanDefinition, Cloneable {
    ...
    protected AbstractBeanDefinition(BeanDefinition original) {
        ...
        if (original instanceof AbstractBeanDefinition originalAbd) {
            if (originalAbd.hasBeanClass()) {
                setBeanClass(originalAbd.getBeanClass());
            }
            ...
        }
        ...
    }
        
    public String getBeanClassName() {
        return (this.beanClass instanceof Class clazz ? clazz.getName() : (String) this.beanClass);
    }
    ...
}

对比以前的代码

if (original instanceof AbstractBeanDefinition) {
    AbstractBeanDefinition originalAbd = (AbstractBeanDefinition) original;
    if (originalAbd.hasBeanClass()) {
        setBeanClass(originalAbd.getBeanClass());
    }
}

最新的spring版本使用的是JDK17
instanceof语法改版是在JDK14中

img

jdk14 新特性

判断引用类型A是否和引用类型B相同,或者说是B的子类,如果是返回true,否则返回false。