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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ollama 在 Linux 环境的安装

ollama 在 Linux 环境的安装 介绍 他的存在在我看来跟 docker 的很是相似&#xff0c;他把市面上已经存在的大语言模型集合在一个仓库中&#xff0c;然后通过 ollama 的方式来管理这些大语言模型 下载 # 可以直接通过 http 的方式吧对应的 shell 脚本下载下来&#xff0c;然…

【10天速通Navigation2】(三) :Cartographer建图算法配置:从仿真到实车,从原理到实现

前言 往期内容&#xff1a; 第一期&#xff1a;【10天速通Navigation2】(一) 框架总览和概念解释第二期&#xff1a;【10天速通Navigation2】(二) &#xff1a;ROS2gazebo阿克曼小车模型搭建-gazebo_ackermann_drive等插件的配置和说明 本教材将贯穿nav2的全部内容&#xff0c…

【Android】Kotlin教程(4)

文章目录 1.field2.计算属性3.主构造函数4.次构造函数5.默认参数6.初始化块7.初始化顺序7.延迟初始化lateinit8.惰性初始化 1.field field 关键字通常与属性的自定义 getter 和 setter 一起使用。当你需要为一个属性提供自定义的行为时&#xff0c;可以使用 field 来访问或设置…

Visual Studio2022 Profile 工具使用

本篇研究下Visual Studio自带的性能分析工具&#xff0c;针对C代码&#xff0c;基于Visual Studio2022 文章目录 CPU使用率检测并发可视化工具使用率视图线程视图内核视图并发可视化工具SDK 参考资料 CPU使用率 对于CPU密集型程序&#xff0c;我们可以通过分析程序的CPU使用率…

【MySQL】MySQL数据库中密码加密和查询的解决方案

本篇博客是为了记录自己在遇到password函数无法生效时的解决方案。通过使用AES_ENCRYPT(str,key)和AES_DECRYPT(str,key)进行加密和解密。 一、问题 自己想创建一个user表&#xff0c;user表中有一个password属性列&#xff0c;自己想对密码进行加密后再存入数据库&#xff0c…

基于JAVA+SpringBoot+Vue的华府便利店信息管理系统

基于JAVASpringBootVue的华府便利店信息管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f3…

GCC 简介

Linux 中的编译器 GCC 的编译原理和使用详解 GCC 简介 GCC&#xff08;GNU Compiler Collection&#xff09;是一套由 GNU 开发的编程语言编译器&#xff0c;它支持多种编程语言&#xff0c;包括 C、C、Objective-C、Fortran、Ada 和 Go 等。GCC 是一个开源的工具集&#xff…

STM32F103C8T6 IO 操作

1.开启相关时钟 在 STM32 微控制器中&#xff0c;开启 GPIO 端口的时钟是确保 IO 口可以正常工作的第一步。 查找 RCC 寄存器使能时钟 在 STM32 中&#xff0c;时钟控制的寄存器通常位于 RCC (Reset and Clock Control) 模块中。不同的 STM32 系列&#xff08;如 STM32F1、STM…

vue3+vite 部署npm 包

公司需要所以研究了一下怎么部署安装&#xff0c;比较简单 先下载个vue项目 不用安准路由&#xff0c;pinna 啥的&#xff0c;只需要一个最简单的模版 删掉App.vue 中的其它组件 npm create vuelatest 开始写自定义组件 新建一个el-text 组件, name是重点&#xff0c;vue3中…

《Python游戏编程入门》注-第3章3

《Python游戏编程入门》的“3.2.4 Mad Lib”中介绍了一个名为“Mad Lib”游戏的编写方法。 1 游戏玩法 “Mad Lib”游戏由玩家根据提示输入一些信息&#xff0c;例如男人姓名、女人姓名、喜欢的食物以及太空船的名字等。游戏根据玩家输入的信息编写出一个故事&#xff0c;如图…

洛谷 P1226:【模板】快速幂

【题目来源】https://www.luogu.com.cn/problem/P1226【题目描述】 给你三个整数 a&#xff0c;b&#xff0c;p&#xff0c;求 a^b mod p。【输入格式】 输入只有一行三个整数&#xff0c;分别代表 a&#xff0c;b&#xff0c;p。【输出格式】 输出一行一个字符串 a^b mod ps&a…

Centos7快速重置root密码

1、重新启动Centos7&#xff0c;5秒内按向下方向键&#xff0c;使其停留在开机界面&#xff0c;如下图。 2、按’e’键&#xff0c;进入如下界面&#xff0c;移动向下方向键至“linux16”开头的行。然后按向右的方向键移动,找到“ro”并将其修改为“rw init/sysroot/bin/bash…

编写一个简单的Iinput_dev框架

往期内容 本专栏往期内容&#xff1a; input子系统的框架和重要数据结构详解-CSDN博客input device和input handler的注册以及匹配过程解析-CSDN博客input device和input handler的注册以及匹配过程解析-CSDN博客 I2C子系统专栏&#xff1a; 专栏地址&#xff1a;IIC子系统_憧憬…

使用 NumPy 和 Matplotlib 进行高级数据可视化:实践指南

使用 NumPy 和 Matplotlib 进行高级数据可视化&#xff1a;实践指南 数据科学和工程实践中&#xff0c;NumPy 和 Matplotlib 是强大的组合工具。本文将进一步展示如何借助这两个库进行更复杂的可视化任务&#xff0c;例如创建多曲线、叠加图、动态可视化等场景。 一、环境准备…

Crowd Counting 系列NO4.—SwitchCNN(CVPR 2017)网络复现

文章目录 引言简介环境配置1、numpy 安装2、matplotlib 安装3、cv2 安装&#xff0c;即opencv-python安装4、scipy 安装5、theano安装7、flip_filters不再支持 数据问题密度图生成注意 引言 SwitchCNN是我看的比较早的一篇多列密集计数网络了&#xff0c;但是其网络实现因各种…

漏洞挖掘 | 基于mssql数据库的sql注入

前记 今天挖edu随意点开个站&#xff0c;发现存在mssql数据库的sql注入&#xff0c;在此分享下整个挖掘过程 目录 0x1 判断网站数据库类型 0x2 了解mssql数据库的主要三大系统表 0x3 了解mssql的主要函数 0x4 判断注入点及其注入类型 0x5 联合查询之判断列数 0x6 联合查询之…

Redis 哨兵 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 哨兵 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 哨兵 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis & 哨兵…

【成长day】NeRF学习记录1:预备知识nerf论文算法学习

个人知乎文章链接&#xff1a;https://zhuanlan.zhihu.com/p/3383996241 预备知识 NeRF重建 NeRF的全称是Neural Radiance Fields&#xff0c;即将场景表示为视场合成的神经辐射场&#xff0c;用神经网络来拟合辐射场&#xff0c;实现对三维场景的隐式表示。本质是完成了图形…

[项目详解][boost搜索引擎#2] 建立index | 安装分词工具cppjieba | 实现倒排索引

目录 编写建立索引的模块 Index 1. 设计节点 2.基本结构 3.(难点) 构建索引 1. 构建正排索引&#xff08;BuildForwardIndex&#xff09; 2.❗构建倒排索引 3.1 cppjieba分词工具的安装和使用 3.2 引入cppjieba到项目中 倒排索引代码 本篇文章&#xff0c;我们将继续项…

Android——事件冲突处理

当我们给列表的item设置了点击事件后&#xff0c;又给item中的按钮设置了点击事件&#xff0c;此时item的点击事件会失效。 解决 给item的布局xml中设置以下属性 android:descendantFocusability"blocksDescendants"<LinearLayout xmlns:android"http://sc…