首先先分享一个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