網站首頁 編程語言 正文
在Kotlin中@JvmOverloads注解的作用:指示Kotlin編譯器為此函數生成替換默認參數值的重載。
如果一個方法有N個參數,其中M個具有默認值,則會生成M個重載。
第一個重載采用N-1個參數(最后一個采用默認值),第二個采用N-2個參數,依此類推。
因為在 Kotlin 中可以調用具有默認參數值的方法或者構造函數,但是在 Java 代碼調用相應 Kotlin 代碼卻不行,及Java 代碼不能調用Kotlin 中定義的具有默認參數的重載函數或構造函數。@JvmOverloads 就是用來解決這一問題的。
例子:
普通函數如下:
Kotlin方法參數無默認值:
@JvmOverloads
fun testOverload(a: String, b: Int, c: Long) {
}
轉換成對應的Java代碼是:
@JvmOverloads
public static final void testOverload(@NotNull String a, int b, long c) {
Intrinsics.checkParameterIsNotNull(a, "a");
}
Kotlin方法參數有一個默認值:
@JvmOverloads
fun testOverload(a: String, b: Int, c: Long = 0L) {
}
轉換成對應的Java代碼是:
@JvmOverloads
public static final void testOverload(@NotNull String a, int b, long c) {
Intrinsics.checkParameterIsNotNull(a, "a");
}
// $FF: synthetic method
public static void testOverload$default(String var0, int var1, long var2, int var4, Object var5) {
if ((var4 & 4) != 0) {
var2 = 0L;
}
testOverload(var0, var1, var2);
}
@JvmOverloads
public static final void testOverload(@NotNull String a, int b) {
testOverload$default(a, b, 0L, 4, (Object)null);
}
Kotlin方法具有兩個默認值:
@JvmOverloads
fun testOverload(a: String, b: Int = 1, c: Long = 0L) {
}
轉換成Java代碼如下:
@JvmOverloads
public static final void testOverload(@NotNull String a, int b, long c) {
Intrinsics.checkParameterIsNotNull(a, "a");
}
// $FF: synthetic method
public static void testOverload$default(String var0, int var1, long var2, int var4, Object var5) {
if ((var4 & 2) != 0) {
var1 = 1;
}
if ((var4 & 4) != 0) {
var2 = 0L;
}
testOverload(var0, var1, var2);
}
@JvmOverloads
public static final void testOverload(@NotNull String a, int b) {
testOverload$default(a, b, 0L, 4, (Object)null);
}
@JvmOverloads
public static final void testOverload(@NotNull String a) {
testOverload$default(a, 0, 0L, 6, (Object)null);
}
構造函數如下:
無默認參數值的構造函數:
open class MaxHeightRelativeLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : RelativeLayout(context, attrs, defStyleAttr) {
}
轉換成Java代碼如下:
public class MaxHeightRelativeLayout extends RelativeLayout {
@JvmOverloads
public MaxHeightRelativeLayout(@NotNull Context context, @NotNull AttributeSet attrs, int defStyleAttr) {
Intrinsics.checkParameterIsNotNull(context, "context");
Intrinsics.checkParameterIsNotNull(attrs, "attrs");
super(context, attrs, defStyleAttr);
}
}
具有一個默認值的構造函數:
open class MaxHeightRelativeLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int) : RelativeLayout(context, attrs, defStyleAttr) {
}
轉換成 Java代碼如下:
public class MaxHeightRelativeLayout extends RelativeLayout {
@JvmOverloads
public MaxHeightRelativeLayout(@NotNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
Intrinsics.checkParameterIsNotNull(context, "context");
super(context, attrs, defStyleAttr);
}
// $FF: synthetic method
public MaxHeightRelativeLayout(Context var1, AttributeSet var2, int var3, int var4, DefaultConstructorMarker var5) {
if ((var4 & 2) != 0) {
var2 = (AttributeSet)null;
}
this(var1, var2, var3);
}
@JvmOverloads
public MaxHeightRelativeLayout(@NotNull Context context, int defStyleAttr) {
this(context, (AttributeSet)null, defStyleAttr, 2, (DefaultConstructorMarker)null);
}
}
具有兩個默認參數值的構造函數:
open class MaxHeightRelativeLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : RelativeLayout(context, attrs, defStyleAttr) {
}
轉Java代碼如下:
public class MaxHeightRelativeLayout extends RelativeLayout {
@JvmOverloads
public MaxHeightRelativeLayout(@NotNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
Intrinsics.checkParameterIsNotNull(context, "context");
super(context, attrs, defStyleAttr);
}
// $FF: synthetic method
public MaxHeightRelativeLayout(Context var1, AttributeSet var2, int var3, int var4, DefaultConstructorMarker var5) {
if ((var4 & 2) != 0) {
var2 = (AttributeSet)null;
}
if ((var4 & 4) != 0) {
var3 = 0;
}
this(var1, var2, var3);
}
@JvmOverloads
public MaxHeightRelativeLayout(@NotNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0, 4, (DefaultConstructorMarker)null);
}
@JvmOverloads
public MaxHeightRelativeLayout(@NotNull Context context) {
this(context, (AttributeSet)null, 0, 6, (DefaultConstructorMarker)null);
}
}
原文鏈接:https://blog.csdn.net/zhangying1994/article/details/108928468
相關推薦
- 2021-11-28 利用C++?OpenCV?實現從投影圖像恢復仿射特性_C 語言
- 2023-07-08 windows編譯libevent報錯
- 2022-02-22 Oracle10G序列名因標識符長度太大導致無法創建
- 2023-10-10 函數柯里化的簡單實現和應用
- 2022-08-05 利用Python?list列表修改元素_python
- 2022-06-29 python人工智能tensorflow函數tf.nn.dropout使用方法_python
- 2022-05-25 kubectl操作命令及使用說明總結_云和虛擬化
- 2022-09-02 Python用matplotlib庫畫圖中文和負號顯示為方框的問題解決_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支