Class.isAssignableFrom用于判断参数类型能否作为调用方类型的实例出现,即B的实例能否赋值给A类型的变量,本质是运行时检查类型兼容性,涵盖子类、实现类、相同类型及数组协变等情形。

Class.isAssignableFrom 用于判断调用方 Class 是否能“赋值给”参数 Class,即:参数类型能否作为调用方类型的实例(或子类/实现类)出现。它本质是检查**类型兼容性**,不是检查“谁继承谁”,而是检查“左边的类能否接收右边类的实例”。
核心逻辑:A.isAssignableFrom(B) ⇔ B 的实例能否赋值给 A 类型的变量
这等价于:
- B 是 A 的子类(含 A 自身)
- B 实现了 A 接口(A 是接口)
- A 和 B 是同一个类或接口
- A 是接口,B 是实现了该接口的类(或另一个接口)
常见写法和含义:
- String.class.isAssignableFrom(Object.class) → false(Object 不能赋值给 String)
- Object.class.isAssignableFrom(String.class) → true(String 实例可赋值给 Object 变量)
- List.class.isAssignableFrom(ArrayList.class) → true(ArrayList 实现 List)
- Runnable.class.isAssignableFrom(Thread.class) → true(Thread 实现 Runnable)
- Integer.class.isAssignableFrom(int.class) → false(基本类型不参与引用类型继承体系)
注意基本类型和包装类的区别
isAssignableFrom 只对引用类型有效。基本类型(int、boolean 等)和它们的包装类(Integer、Boolean)之间没有 isAssignableFrom 关系:
- int.class.isAssignableFrom(Integer.class) → false
- Integer.class.isAssignableFrom(int.class) → false
- 自动装箱/拆箱是编译器行为,运行时 Class 层面不体现这种关系
数组类型的特殊规则
数组类型也遵循相同逻辑,且支持协变:
立即学习“Java免费学习笔记(深入)”;
- Object[].class.isAssignableFrom(String[].class) → true(String[] 是 Object[] 的子类型)
- Serializable[].class.isAssignableFrom(String[].class) → true(因为 String 实现 Serializable,数组也继承该实现)
- String[].class.isAssignableFrom(Object[].class) → false
与 instanceof 的对应关系
如果 a instanceof A 成立,则必有 A.class.isAssignableFrom(a.getClass()) 为 true(前提是 a 不为 null)。但反过来不严格成立——isAssignableFrom 还可用于尚未实例化的类型判断,比如在泛型擦除后做类型检查、框架中预判兼容性等场景。


















