1. ?、?. 、?:和 !!.
//? 表示当前对象可以为null
var a:String? = null
//kotlin
a?.start()
//相当于java
if(a!=null){
a.start();
}
//kotlin
a!!.start()
//相当于java
if(a!=null){
a.start();
}else{
throw new KotlinNullPointException();
}
//?:表示左边为空就执行右边的操作
var a:String? = "hello"
//此时b=5
var b=a?.length ?: 100
再比如以下两行代码
class MyFragment:Fragment() {
private var myFragmentBinding:FragmentMyBinding? = null
private val binding get() = myFragmentBinding!!
}
编译后如下所示
public final class MyFragment extends Fragment {
private FragmentMyBinding myFragmentBinding;
private final FragmentMyBinding getBinding() {
FragmentMyBinding var10000 = this.myFragmentBinding;
Intrinsics.checkNotNull(var10000);
return var10000;
}
}
大概意思就是第一行声明一个可以为空的myFragmentBinding变量,第二行获取这个变量,!!代表为空时就抛出异常,从checkNotNull方法源码中可以看出来:
public static void checkNotNull(Object object) {
if (object == null) {
throwJavaNpe();
}
}
......
@SinceKotlin(version = "1.4")
public static void throwJavaNpe() {
throw sanitizeStackTrace(new NullPointerException());
}
2.data class
使用data class来创建javaBean类,可以自动生成一些属性方法,比如toString、equals、hashcode和get、set方法等等。