本文用于记录我在使用 Kotlin 中遇到的问题,有注意事项,也有与 java 的比较,比较零散,持续更新,遇到问题再进行记录。
1、Kotlin 字符串的比较
在 Java 中 == 比较的是两个字符串的地址,而 Kotlin 是直接比较值,所以字符串比较可以直接使用 ==
val str1 = "success"
val str2 = "success"
if (str1 == str2) {
// always true
}
2、Kotlin 可见性修饰符
Kotlin 有四种修饰符:private、protected、internal、public。默认修饰符为 public,可见性如下递增:
- private:类内部可见
- protected:类内部+子类可见
- internal:同模块可见(Kotlin 在 Android 中的模块我概念还不是很清楚)
- public:都可见
具体可以参考 :https://www.kotlincn.net/docs/reference/visibility-modifiers.html
下图是 java 可见性修饰符:

3、Kotlin 中 ? 和 !! 的使用
// kotlin:
a?.foo()
// 相当于java:
if (a != null) {
a.foo();
}
/** 分割线 **/
// kotlin:
a!!.foo()
// 相当于java:
if (a != null) {
a.foo();
} else {
throw new KotlinNullPointException();
}
在平常开发中,能使用 ?. 就使用 ?. 吧, 如果用 !! 不小心崩溃就难受了
4、Kotlin 为 Intent() 设置 flags
// 清除栈里的所有 activity. (要使用 Intent.addFlags,不能使用 Intent.flags 因为 Kotlin中 不能使用 | 符号)
val intent = Intent(xxx, xxx)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
使用 Intent 发现没跳过去,也没崩溃。很有可能是出现了空指针,建议在使用 Intent 处打断点检查参数是否为空。
5、Kotlin 自增自减
Java 中有 a++ 和 a--,而 Kotlin 中不能这样写了。
// a.dec() 等同于 a-- 和 --a
a = a.dec()
// a.inc() 等同于 a++ 和 ++a
a = a.inc()
注意:kotlin 的函数运算不会改变原有的值,例子如下:
var a = 0
println(a.inc)
println(a)
// 输出:
1
0
6、Kotlin 的 View.setOnLongClickListener 方法要有一个返回值。如果我们需要从 lambda 表达式中返回,我们必须给它加标签并用以限制 return。
// 写法1:使用标签来限制返回,标签与 lambda 函数同名
View.setOnLongClickListener @setOnLongClickListener{
// TODO
return@setOnLongClickListener
}
// 写法2:隐式标签,标签与 lambda 函数同名
View.setOnLongClickListener {
// TODO
return@setOnLongClickListener true
}
7、在 Activity 中定义了一个 inner class Adapter,然后这个 Adapter 中定义了 interface,编译器就报错了。将 inner 去掉编译器就不报错了,难道是 Kotlin 的内部类不能定义接口?
inner class CallLogAdapter : RecyclerView.Adapter<CallLogAdapter.ViewHolder>() {
// 定义这个接口时编译器就报错了
interface OnItemClickListener {
// interface is not allowed here
}
}
8、待更新。。。
网友评论