@JvmDefaultWithout/WithCompatibility

@JvmDefaultWithoutCompatibility

@JvmDefaultWithCompatibility

使用

@JvmDefaultWithoutCompatibility Used only with -Xjvm-default=all-compatibility.

@JvmDefaultWithCompatibility Used only with -Xjvm-default=all.

区别

前置知识

当一个接口包含默认方法(在Kotlin中称为JVM默认方法),而其派生类在运行时未实现这些默认方法时,编译器会生成一个特殊的类,通常称为 DefaultImpls,其中包含这些默认方法的实现。

在Kotlin中,兼容性访问器是一种机制,用于处理默认方法在接口中的实现。

以下是两种不同的生成方式:

  1. 不带兼容性访问器的类或接口:

    • 在这种情况下,编译器生成的类或接口仅包含默认方法,而不会生成专门的访问器类(通常是 DefaultImpls)来提供对这些默认方法的实现的访问。这意味着,如果派生类没有实现这些默认方法,可能会在运行时出现问题,因为没有专门的访问器来提供实现。
  2. 带兼容性访问器的类或接口:

    • 在这种情况下,编译器生成了专门的访问器类(通常是 DefaultImpls),该类包含接口中默认方法的实现。这个访问器类允许在运行时,即使派生类没有显式实现这些默认方法,仍然可以通过访问器类来调用这些方法,保持二进制兼容性。

在Kotlin中,通过使用 JvmDefaultWithoutCompatibilityJvmDefaultWithCompatibility 这两个注解,你可以控制编译器是否生成这种带有兼容性访问器的类或接口。如果选择 JvmDefaultWithoutCompatibility,则生成的类或接口将不包含专门的兼容性访问器,而 JvmDefaultWithCompatibility 则强制生成带有兼容性访问器的类或接口。

判断是否需要带兼容性访问器的类或接口,取决于你的项目的具体需求和兼容性策略。

不带兼容性访问器的类或接口(使用 JvmDefaultWithoutCompatibility):

  1. 新项目: 如果你正在创建一个新的Kotlin项目,并且不依赖于现有的Java或Kotlin代码,可以选择使用不带兼容性访问器的类或接口。这样可以减少生成的字节码大小,并避免引入不必要的访问器类。

  2. 不需要二进制兼容性: 如果你的库或应用程序不需要与现有Java代码保持二进制兼容性,并且你可以容忍在将来可能对接口进行更改而不保留二进制兼容性的情况下,选择不带兼容性访问器的类或接口。

带兼容性访问器的类或接口(使用 JvmDefaultWithCompatibility):

  1. 已有项目并且需要与Java代码交互: 如果你的项目已经存在,并且需要与现有的Java代码进行交互,特别是在Java代码中实现了Kotlin接口的默认方法,那么选择带兼容性访问器的类或接口是一个安全的选择。

  2. 需要保持二进制兼容性: 如果你的库或应用程序需要与现有Java代码保持二进制兼容性,尤其是在接口可能在将来进行修改时,选择带兼容性访问器的类或接口是更保守的选择。这确保了即使在将来添加了新的默认方法,现有的派生类仍然可以正常工作。

  3. 涉及公共API: 如果你的接口是一个公共API,可能被其他项目或团队使用,那么选择带兼容性访问器的类或接口通常是一个更安全的选择,以避免破坏现有的实现。

总的来说,选择是否使用带兼容性访问器的类或接口取决于你的项目的特定需求和兼容性要求。如果不确定,可以考虑在项目中试验并评估不同的选项,以了解它们对项目的影响。

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

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

相关文章

入门Adaptive AUTOSAR(一) -- 为什么要提Adaptive(1)

目录 1.Adaptive AUTOSAR 1.1 AUTOSAR的由来 1.2 AUTOSAR的方法论 1.3 Why Adaptive 2.小结 1.Adaptive AUTOSAR 1.1 AUTOSAR的由来 2017年,国内绝大部分供应商还在思考如何用最小代价切入到AUTOSAR Classic Platform的时候,AUTOSAR Adaptive Pla…

把持中国互联网流量的“四大家族”,各个牛逼plus!

中国互联网80%流量被四大家族把持着,其余要么去这些家族批发流量,要么去抢占剩余20%。 以下是对中国互联网流量四大家族的介绍和代表性的流量入口产品: 百度系: 百度是中国最大的搜索引擎公司,其搜索引擎百度是中国互…

【位运算】Leetcode 两整数之和

题目解析 371. 两整数之和 算法讲解 异或的本质就是无进位相加,但是我们需要处理进位,就需要知道哪一位上有进位,再让无进位相加的结果 进位即可,在重复这个过程,当进位等于0的时候,说明相加的过程已经结…

OSPF防环文档

OPSF在区域内会产生俩类LSA:Router LSA ,Network LSA 路由器以自己为树根构建最短路径树 ,这里的最短路径树按两步形 成,第一步,仅考虑路由器和传输网络之间的连接。通过 Dijkstra 算法,根据链路状态数据…

[Linux] keytool 命令(by Copilot)

keytool 是一个用于管理密钥和证书的 Java 工具。它可以用于生成、导入、导出和修改密钥库和证书。以下是一些常用的 keytool 命令和参数: 1.生成密钥对: 使用 -genkeypair 命令生成密钥对,例如: keytool -genkeypair -alias m…

Docker - MongoDB

博文目录 文章目录 说明命令后置 说明 Docker Hub MongoDB 数据卷数据卷印射在容器内的路径mongo/data/dbmongo.config.db/data/configdb 容器内的路径说明/data/db数据目录/data/configdb不太清楚 部分环境变量是否必要说明MONGO_INITDB_DATABASE可选设置数据库的名称, 首次…

吴恩达2022机器学习专项课程(一) 第二周课程实验:特征工程和多项式回归(Lab_04)

目标 探索特征工程和多项式回归,使用线性回归来拟合非常复杂甚至非线性的函数。 1.为什么线性回归能拟合非线性函数? fxw*xb,属于线性回归的扩展,这个公式在数学中不属于线性,因为有x,而在机器学习中属于…

图文教程 | 2024Typora最新版免费激活使用教程(新旧版可用)

一、打开官网下载最新版Typora Typora 官网下载 安装: Typora中文官网:https://typoraio.cn/ Typora官网:https://typora.io/releases/all 官网长这个样子 下面这个不是官网!!!!注意&#x…

通讯录的实现(顺序表版本)

我们知道通讯录是基于顺序表的前提下,要写好通讯录我们就要深入了解好顺序表。我们先来看看什么是顺序表。(注意今天代码量有点多,坚持一下)。冲啊!兄弟们! 顺序表的简单理解 对于顺序表,我们首…

docker ruoyi 部署

安装linux系统 安装docker 安装 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 启动docker指令 sudo systemctl start dockersudo systemctl daemon-reloaddocker 开机自启 systemctl enable docker配置idea环境 配置idea环境 安装docker-compos…

用AI的视角看世界

前言 2024年将是Ai人工智能在各个行业垂直领域发展的元年。 随着2022年11月openai 的大语言模型chatgpt3.5的诞生,已经预示着互联网时代,移动互联网时代即将迎来新的变革,也预示着web3.0和元宇宙更近了一步。 回顾历史,互联网的…

RuoYi-Vue若依管理系统学习笔记

1.环境部署 #准备工作 JDK > 1.8 (推荐1.8版本) Mysql > 5.7.0 (推荐5.7版本) Maven > 3.0 #运行系统 1、前往Gitee下载页面(https://gitee.com/y_project/RuoYi (opens new window))下载解压到工作目录 2、导入到Eclipse,菜单 File -> Import&#xff…

使用hexo+gitee从零搭建个人博客

一、环境准备 1.Node.js:下载 | Node.js 中文网 (nodejs.cn) ,Hexo 是基于Node.js 的博客框架 教程:https://blog.csdn.net/weixin_52799373/article/details/123840137 node -v npm -v 安装 Node.js 淘宝镜像加速器 (cnpm&am…

LeetCode 70. 爬楼梯 --- 经典动态规划

爬楼梯 1. 动态规划思路2. 解决方法3. 代码 题目简述:爬 n 阶楼梯才能到达楼顶,每次可以爬 1 或 2 个台阶。 1. 动态规划思路 动态规划是一种常见的解决问题的方法,它通过将大问题分解成更小的子问题,并利用子问题的解来解决大问…

linux下coredump问题的定位分析方法

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 参考:https://blog.csdn.net/m0_73698480/article/details/130077852 最近定位了一段时间linux下的崩溃问题,又收集了一些思路,特整理记录一下。 常见coredump定位方法是&#xff1a…

软考中级网络工程师-网络技术

下列命令片段含义是( )。 system-view [HUAWEI] observe-port 1 interface gigabitethernet 0/0/1 [HUAWEI] interface gigabitethernet 0/0/2 [HUAWEI-GigabitEthernet0/0/2] port-mirroring to observe-port 1 inbound A 配置端口镜像 B 配置链路聚合 C 配置逻辑接口 D 配置访…

大模型应用工具 LangChain 入门书籍: LangChain 简明讲义

书籍信息 书名:《LangChain 简明讲义:从 0 到 1 构建 LLM 应用程序》出版社:电子工业出版社书籍链接:https://item.jd.com/14105705.html书籍配套代码:https://github.com/kebijuelun/langchain_book 书籍背景 计算机…

力扣LeetCode138. 复制带随机指针的链表 两种解法(C语言实现)

目录 题目链接 题目分析 题目定位: 解题思路 解题思路1(粗暴但是复杂度高) 解题思路2(巧妙并且复杂度低) 题目链接 138. 复制带随机指针的链表https://leetcode-cn.com/problems/copy-list-with-random-pointer/ …

实战项目——智慧社区(四)之 系统管理

1、用户管理 提供查询和搜索用户、根据id查询用户信息、添加用户、修改用户、删除用户的功能 界面 添加用户 修改用户信息 2、角色管理 提供查询和搜索角色、根据id查询角色信息、添加角色、修改角色、删除角色的功能 界面 添加角色 修改角色 3、菜单管理 提供查询和搜索菜…

机器学习在安全领域的应用:从大数据中识别潜在安全威胁

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…