Class.isAssignableFrom用于判断右侧类能否赋值给左侧类类型,即右侧是否为左侧的子类、实现类或自身;如Animal.class.isAssignableFrom(Dog.class)返回true,而Dog.class.isAssignableFrom(Animal.class)返回false。

Class.isAssignableFrom 用于判断一个类或接口是否能被另一个类或接口“赋值”,即是否具有继承(或实现)关系,而不是直接判断“谁是子类”。它检查的是左侧类型能否接收右侧类型的实例,也就是“右侧是否是左侧的子类、实现类或自身”。
核心逻辑:左边能不能装下右边
调用形式:classA.isAssignableFrom(classB) 表示:classB 的实例能否赋值给 classA 类型的变量。成立条件包括:
- classB 是 classA 的子类(含直接/间接继承)
- classB 实现了 classA 接口
- classB 就是 classA 本身(相同类型)
- classA 是接口,classB 是其实现类(或其子类)
- classA 是数组类型,classB 是其元素类型或兼容类型(如 Object[].class.isAssignableFrom(String[].class) 返回 true)
常见用法对比(避免反写)
容易写反!记住:isAssignableFrom 的“主语”是目标类型(你想往哪儿装),不是源类型。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Animal.class.isAssignableFrom(Dog.class)→ true(Dog 可以赋给 Animal 变量) -
Dog.class.isAssignableFrom(Animal.class)→ false(Animal 不能赋给 Dog 变量) -
List.class.isAssignableFrom(ArrayList.class)→ true(ArrayList 实现 List) -
String.class.isAssignableFrom(Object.class)→ false(Object 不是 String 的子类)
和 instanceof 的关系
运行时 obj instanceof Class 的效果,等价于编译时 Class.isAssignableFrom(obj.getClass())(前提是 obj 非 null)。
立即学习“Java免费学习笔记(深入)”;
-
new Dog() instanceof Animal⇔Animal.class.isAssignableFrom(new Dog().getClass()) - 区别在于:isAssignableFrom 在编译期就能用类对象判断,不依赖实例;instanceof 必须有实例且在运行时判断
注意边界情况
以下返回 true,但容易忽略:
-
Object.class.isAssignableFrom(anyClass)总是 true(所有类都继承 Object) -
interfaceA.class.isAssignableFrom(concreteClass)为 true,只要 concreteClass 实现 interfaceA 或其子接口 - 基本类型之间不适用(如 int.class.isAssignableFrom(long.class) → false),它们没有继承关系;包装类才参与引用类型判断(Integer.class.isAssignableFrom(Number.class) → false,反过来才是 true)

















