-
app的build.gradle中也需要加上implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version",否则可能会出现Unresolved reference: JvmName类似的错误
-
Arouter中使用kotlin编写的Interceptor不生效的问题:
问题原因在于kotlin文件中的@Interceptor注解没有被正确处理,因此没有将自定义的Interceptor加入到Interceptor集合中,解决方法为在module的build.gradle文件中:
a. 加入
apply plugin: 'kotlin-kapt'
b. 使用
kapt { arguments { arg("moduleName", project.getName()) } }
代替
javaCompileOptions { annotationProcessorOptions { arguments = [moduleName: project.getName()] } }
c. 使用
kapt 'com.alibaba:arouter-compiler:1.0.4'
代替
annotationProcessor 'com.alibaba:arouter-compiler:1.0.4'
ps:kapt 可以替代annotationProcessor 注释java类
-
在java代码中调用kotlin编写的object类中的方法时,需要先获取该object类的INSTANCE实例,然后再调用对应方法。
-
kotlin中集合有严格的只读和可写的区分,使用List类型是不能调用诸如clear,remove等方法的,要使用MutableList
-
kotlin中的类的构造方法用constructor表示,与java不同的是,java中用与类名相同且没有返回值的方法表示构造方法,这个区别也导致kotlin类中可以存在名字和类名相同的非构造方法
-
当在匿名内部类中(如各种监听)想要调用一个跟回调方法同名的外部类的方法怎么办?用this@外部类类名.方法名
-
声明为var的nullable变量在使用时出现Smart cast to 'String' is impossible, because 'a.name' is a mutable property that could have been changed by this time的报错,解决方法为:
-
使用val声明nullable值,这样nullable值就不可能被修改
class A { val name: String? = null }
-
把nullable值赋给一个新的变量,再做其他操作
val name = a.name if(name != null) { names.add(name); }
-
使用?.let
a.name?.let { name -> names.add(name) } a.name?.let { names.add(it) } a.name?.let(names::add)
-
-
使用Gson解析json时,如果bean类继承了父类并在主构造函数中覆盖了父类的属性,那么会报错:declares multiple JSON fields named name 比如:
open class Person: Serializable{ open var name: String? = null } class SpecialPerson(override var name: String?) : Person() { override fun toString(): String { return name?: "" } }
解决方法是,在子类中用init初始化块将构造函数中获取到的属性值赋给继承的属性,即:
class SpecialPerson(var specialName: String?) : Person() { init { name = specialName } override fun toString(): String { return name?: "" } }
未完待续。。。