0
点赞
收藏
分享

微信扫一扫

【20】kotlin 重载

天悦哥 2023-03-10 阅读 67


首先先分享一个java的方法重载的bug

remove()

package com.yzdzy.kotlin.chapter4.overloads;

import java.util.ArrayList;
import java.util.List;

public class Bug {
public static void main(String[] args) {
List<Integer> integerList = new ArrayList<>();
integerList.add(13);
integerList.add(2);
integerList.add(3);
integerList.add(23);
integerList.add(5);
System.out.println(integerList);
integerList.remove(1);
integerList.remove(5);
System.out.println(integerList);


}
}

可以按住ctrl 点击List进入源码 搜索remove

看这就是一个方法的重载;

什么bug呢。当我们移除

package com.yzdzy.kotlin.chapter4.overloads;

import java.util.ArrayList;
import java.util.List;

public class Bug {
public static void main(String[] args) {
List<Integer> integerList = new ArrayList<>();
integerList.add(13);
integerList.add(2);
integerList.add(3);
integerList.add(23);
integerList.add(5);
System.out.println(integerList);
integerList.remove(1);
integerList.remove(5);
System.out.println(integerList);


}
}

他会提示index 不能使用remove(Object )这个方法

像java sdk重载都有bug 

所以我们要慎用重载。

直接copy代码 到kt

val integerList: MutableList<Int> = ArrayList()
integerList.add(13)
integerList.add(2)
integerList.add(3)
integerList.add(23)
integerList.add(5)
integerList.add(6)
println(integerList)
integerList.removeAt(1)
integerList.remove(5)
println(integerList)

稍微修改下。。kt有一个方法remove 和removeAt 这说明kt真不愧我为android官方开发语言还是聪明点

下面介绍重载

package com.yzdzy.kotlin.chapter4.overloads

import java.util.*

class Overloads {

fun a():Int{
return 0
}
// 方法的重载 方法名相同 ,参数不同或者参数类型不同
fun a(int:Int):Int{
return 1
}
fun a(int:String):Int{
return 1
}
//方法签名。返回值不能做为方法签名的一部分
// fun a():String{
//
// }
}

fun main(args: Array<String>) {

val overloads = Overloads()
val integerList: MutableList<Int> = ArrayList()

}

我们已知a方法() 返回0  那么可以修改代码为

package com.yzdzy.kotlin.chapter4.overloads

import java.util.*

class Overloads {


// 方法的重载 方法名相同 ,参数不同或者参数类型不同
fun a(int: Int = 0): Int {
return 1
}

fun a(int: String): Int {
return 1
}
//方法签名。返回值不能做为方法签名的一部分
// fun a():String{
//
// }
}

fun main(args: Array<String>) {

val overloads = Overloads()
val res= overloads.a()
println(res)

}

 kt代码也能在java中执行。

不写报错。。。玩不起是不是。。

其实他可以在kt上面加注解

@JvmOverloads

package com.yzdzy.kotlin.chapter4.overloads

import java.util.*

class Overloads {


// 方法的重载 方法名相同 ,参数不同或者参数类型不同

@JvmOverloads
fun a(int: Int = 0): Int {
return 1
}

fun a(int: String): Int {
return 1
}
//方法签名。返回值不能做为方法签名的一部分
// fun a():String{
//
// }
}

fun main(args: Array<String>) {

val overloads = Overloads()
val res= overloads.a()
println(res)

}

java代码也就不报错了

 

哦泡时间到 我们总结一下

方法重载

Overloads

名称相同,参数不同的方法

Jvm函数签名的概:函数名、参数列表(不包括返回值)

默认参数

为函数参数设定一个默认值

可以为任意位置的参数设置默认值

函数调用产生混淆时用具名函数

方法重载与默认参数

二者的相关性 (可以相互转换) @JvmOverloads

避免定义关系不大的重载 list.remove bug

 

 

 

举报

相关推荐

0 条评论