Java基础- isAssignableFrom() 检查类型之间的兼容性

isAssignableFrom是Java中的一种用于类型检查的方法,属于Class类的实例方法。它主要用于判断某个类或接口是否可以赋值给当前类,通常用来在运行时检查类之间的类型兼容性。

方法定义

public boolean isAssignableFrom(Class<?> cls)
  • 参数Class<?> cls,即要进行检查的类对象。
  • 返回值boolean,返回true表示当前类可以从指定类赋值,否则返回false

用途

isAssignableFrom主要用于检查类与类之间、接口与接口之间,或类与接口之间是否满足“赋值兼容性”的关系。特别是在框架、反射、泛型检查等需要动态类型检查的场景中,它十分有用。

工作原理

在Java中,如果类A可以赋值给类B,即B b = (B) a;是合法的赋值操作,那么B.class.isAssignableFrom(A.class)会返回true。这种赋值兼容性通常包括以下情况:

  1. 同一类型:一个类或接口与自身比较,结果为true
  2. 父类检查子类:父类对其子类调用isAssignableFrom返回true,即可以赋值。
  3. 接口检查实现类:接口对其实现类调用isAssignableFrom返回true
  4. 子类、实现类检查父类或接口:返回false,因为子类或实现类不能被安全地赋值给父类或接口。

使用示例

class Animal {}
class Dog extends Animal {}
interface Pet {}public class Main {public static void main(String[] args) {// 1. 父类对子类System.out.println(Animal.class.isAssignableFrom(Dog.class)); // true// 2. 子类对父类System.out.println(Dog.class.isAssignableFrom(Animal.class)); // false// 3. 类对自身System.out.println(Animal.class.isAssignableFrom(Animal.class)); // true// 4. 接口对实现类System.out.println(Pet.class.isAssignableFrom(Dog.class)); // false (Dog does not implement Pet)}
}

典型应用场景

isAssignableFrom在反射和泛型检查中十分常见。以下是几个典型场景:

1. 反射中检查方法参数或返回类型

使用isAssignableFrom来确保方法调用的参数类型匹配。

public void invokeIfAssignable(Class<?> expectedType, Object obj) {if (expectedType.isAssignableFrom(obj.getClass())) {System.out.println("类型匹配,可以执行操作。");// 执行特定操作} else {System.out.println("类型不匹配,不能执行操作。");}
}
2. 判断集合中的元素类型

当使用集合存储不同类型对象时,可以通过isAssignableFrom判断某个对象是否属于某类或其子类。

List<Object> list = Arrays.asList("String", 123, 45.67);
for (Object obj : list) {if (Number.class.isAssignableFrom(obj.getClass())) {System.out.println(obj + " 是一个数字类型");}
}
3. 动态加载类并验证其类型

在类加载时,isAssignableFrom可以确保动态加载的类符合预期的父类或接口。

public void loadAndCheckClass(String className) throws ClassNotFoundException {Class<?> loadedClass = Class.forName(className);if (Runnable.class.isAssignableFrom(loadedClass)) {System.out.println(className + " 实现了Runnable接口");} else {System.out.println(className + " 没有实现Runnable接口");}
}

注意事项

  • 区别于instanceofisAssignableFrom是针对Class类的类型检查,用于检查两个类对象的类型关系,而instanceof是用于检查实例是否是某个类的对象。
  • 静态检查,不创建对象isAssignableFrom不会创建对象,只是比较类的兼容性,通常在反射或动态类型检查中使用。

总结

isAssignableFrom方法是Java中一个实用的工具,用于在类加载和类型兼容性判断时检查类间的赋值关系。它让开发者能够在运行时进行灵活的类型验证,从而安全地执行类型相关操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/457110.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入剖析 C 与 C++ 动态内存管理之术

亲爱的读者朋友们&#x1f603;&#xff0c;此文开启知识盛宴与思想碰撞&#x1f389;。 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f970;&#xff0c;共创活力社区。 &#x1f525;&#x1f525;&#x1f525;【C】进阶&#xff1a;类相关…

Python实现基于WebSocket的stomp协议调试助手工具

stomp协议很简单&#xff0c;但是搜遍网络竟没找到一款合适的客户端工具。大多数提供的都是客户端库的使用。可能是太简单了吧&#xff01;可是即便这样&#xff0c;假如有一可视化的工具&#xff0c;将方便的对stomp协议进行抓包调试。网上类似MQTT的客户端工具有很多&#xf…

linux shell 脚本语言教程(超详细!)

Shell 编程详细指南 什么是 Shell&#xff1f; Shell 是用户与操作系统内核之间的接口&#xff0c;允许用户通过命令行输入来控制操作系统。它充当命令解释器&#xff0c;读取用户输入的命令并执行相应的操作。Shell 提供了强大的脚本编程能力&#xff0c;可以自动化许多任务…

【javax maven项目缺少_Maven的依赖管理 引入依赖】

javax maven项目缺少_Maven的依赖管理 引入依赖 Maven的依赖管理 - 引入依赖依赖管理(引入依赖)导入依赖 https://blog.csdn.net/weixin_28932089/article/details/112381468 Maven的依赖管理 - 引入依赖 依赖管理(引入依赖) 能够掌握依赖引入的配置方式 导入依赖 导入依赖练…

银行客户贷款行为数据挖掘与分析

#1024程序员节 | 征文# 在新时代下&#xff0c;消费者的需求结构、内容与方式发生巨大改变&#xff0c;企业要想获取更多竞争优势&#xff0c;需要借助大数据技术持续创新。本文分析了传统商业银行面临的挑战&#xff0c;并基于knn、逻辑回归、人工神经网络三种算法&#xff0…

重构案例:将纯HTML/JS项目迁移到Webpack

我们已经了解了许多关于 Webpack 的知识&#xff0c;但要完全熟练掌握它并非易事。一个很好的学习方法是通过实际项目练习。当我们对 Webpack 的配置有了足够的理解后&#xff0c;就可以尝试重构一些项目。本次我选择了一个纯HTML/JS的PC项目进行重构&#xff0c;项目位于 GitH…

[旧日谈]高清画面撕裂问题考

背景 无边框透明背景透明的窗口&#xff0c;在随着缩放比例非整数倍数放大时的画面发生了露底、撕裂问题。 当我们在使用Qt开发的时候&#xff0c;遇到了一个结构性问题。因为我们的软件是自己做的&#xff0c;所以要自己定义标题栏&#xff0c;所以我们设置了软件为FrameLess…

mono源码交叉编译 linux arm arm64全过程

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

mysql——事务详解

一、事务定义 事务&#xff1a;事务是一个最小的不可在分的工作单元&#xff1b;通常一个事务对应一个完整的业务(例如银行账户转账业务&#xff0c;该业务是一个最小的工作单元)事务保证多条sql语句要么同时执行成功&#xff0c;要么同时执行失败一个完整的业务需要批量的DML…

移除Microsoft Edge浏览器“由你的组织管理“提示的方法

背景&#xff1a; 点击Microsoft Edge浏览器右上角的按钮有时候会出现提示“由你的组织管理”。但实际上自己的电脑并没有被公司或其他企业管理。 解决方案&#xff1a; 提示&#xff1a;修改注册表如果操作不当会影响电脑&#xff0c;请提前备份注册表&#xff01;&#xff…

Java 开发——(上篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus

一、概述 记录时间 [2024-10-23] 本文是一个基于 Spring Boot 3 MybatisPlus 的项目实战开发&#xff0c;主要涵盖以下几个方面&#xff1a; 从零开始的项目创建IDEA 中开发环境的热部署Maven、Swagger3、MybatisPlus 等的配置路由映射知识静态资源访问文件上传功能实现拦截器…

Qt之QCamera的简单使用

文章目录 一、相机操作相关示例1.摄像头操作内容使用示例2.摄像头信息展示使用示例3.摄像头设置切换、预览操作示例 二、相机使用个人操作理解1.相机类支持信息获取2.相机类曝光、焦点、图像处理控制信息获取3.快速启动相机设置&#xff08;各个设备处于理想状态&#xff09; 三…

地平线x5下运行yolo11s-seg模型

经过地瓜机器人工作人员&#xff08;感谢吴超同学&#xff09;的及时技术支持&#xff0c;整体比较顺利的跑起来了yolo11s-seg分割模型。将一些经验记录下来&#xff1a; 首先下载使用docker镜像&#xff1a; https://developer.d-robotics.cc/forumDetail/228559182180396619 …

linux驱动—注册总线分析

成功地在直接注册了一个总线&#xff0c;并且在总线目录下创建了属性文件&#xff0c;什么会在 sys/bus 目录下生成 mybus,目录以及对应的 devices,drivers, drivers_autoprobe,drivers_probe&#xff0c;uevent目录和属性呢? /sys,目录下的目录都对应一个kobject&#xff0c;…

如何成为录屏高手?2024年全新录屏工具梳理,你选对了吗?

如何录屏&#xff1f;录屏现在对我们来说太重要了&#xff0c;不管是做教学视频、演示文稿&#xff0c;还是录游戏或者教别人怎么用软件&#xff0c;都离不开录屏工具。但是市面上录屏软件一大堆&#xff0c;挑个适合自己的真不容易。今天&#xff0c;我就来给你介绍几款特别火…

知识图谱解码:AI 如何构建知识网络

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 AI工具集1&#xff1a;大厂AI工具【共23款…

凸轮应用实例(带进料装置的伺服压机控制)

凸轮表凸轮关系曲线建立 博途S7-1500T PLC曲柄连杆模型仿真(电子凸轮完整配置+SCL源代码)-CSDN博客文章浏览阅读4次。这篇博客介绍了曲柄连杆机构的位移与曲柄转动角度关系,通过MATLAB进行计算和Simulink验证,并提供博途SCL源代码。文章链接提供了详细的曲柄连杆数学模型分析…

分布式理论基础

文章目录 1、理论基础2、CAP定理1_一致性2_可用性3_分区容错性4_总结 3、BASE理论1_Basically Available&#xff08;基本可用&#xff09;2_Soft State&#xff08;软状态&#xff09;3_Eventually Consistent&#xff08;最终一致性&#xff09;4_总结 1、理论基础 在计算机…

WASM 使用说明23事(RUST实现)

文章目录 1. wasm是什么1.1 chatgpt定义如下:1.2 wasm关键特性&#xff1a; 2. wasm demo2.1 cargo 创建项目2.2 编写code2.3 安装wasm-pack2.4 编译 3.1 html页面引用wasm代码&#xff08;js引用&#xff09;3.2 访问页面4 导入js function4.1 编写lib.rs文件&#xff0c;内容…

【SpringCloud】06-Sentinel

1. 雪崩问题 一个微服务出现问题导致一系列微服务都不可以正常工作。 服务保护方案&#xff1a; 请求限流。线程隔离。 服务熔断 2. Sentinel 启动Sentinel java -Dserver.port8090 -Dcsp.sentinel.dashboard.serverlocalhost:8090 -Dproject.namesentinel-dashboard -ja…