一、参数遮蔽
方法中可以定义和方法参数同名的属性,而java则不支持此操作
fun test(name: String){
val name = "张三"
Log.e("aa", name)
}
二、java混编Null安全
调用java方法编译则不会校验Null安全,需要自己处理
public class Util {
public static String test(){
return null;
}
}
//kotlin
fun test(){
val name: String = Util.test()
name.length
}
解决:对于java方法返回值可能为Null情况,定义可空参数
fun test(){
val name: String? = Util.test()
name?.length
}
三、data class + Gson反序列化,默认值失效问题
data class UserBean(
val age: Int = 1,
val name:String
)
val userBean = Gson().fromJson(jsonStr, UserBean::class.java)
获取到的userBean.age为null而非默认值
原因:Gson获取对象过程
- 先尝试获取无参构造函数(UserBean没有无参构造)
- 失败则尝试List、Map等情况的构造函数
- 最后使用Unsafe.newInstance(不会调用构造函数,通过反射直接给属性赋值,导致对象初始化代码不会调用)
解决:(1)对每个参数赋默认值【该方式为kotlin提供无参构造函数】(2)使用class定义var属性
四、Gson反序列化空安全无效
val user: UserBean = Gson().fromJson("", UserBean().javaClass)
编译的时候不会提示异常,但运行则发生Caused by: java.lang.IllegalStateException: Gson().fromJson("", UserBean().javaClass) must not be null
解决:对user定义为可空类型UserBean?