每次我在Android Studio中实现侦听器接口的必需重写方法时(当我使用CTRL + I而不是手动编写时),父级始终可以为空。例如:
class Location : AppCompatActivity(), RadioGroup.OnCheckedChangeListener {
override fun onCheckedChanged(group: RadioGroup?, checkedId: Int) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
为什么RadioGroup
默认为空?如果调用了onCheckedChanged
-难道RadioGroup
不能为空吗?
答案 0 :(得分:0)
自动生成的实现期望使用可为空的参数的原因,对于没有@NonNull
注释的参数,从Java(对于Java定义的方法)期望可为空的类型更安全。但是对于带有注释参数的方法,将根据注释生成实现。
假设我们有Java接口:
/**
* Java interface
*/
public interface Callback {
void invoke(Object undefined, @Nullable Object nullable, @NonNull Object nonNull);
}
它的实现:
/**
* Kotlin implementation
*/
class CallbackImpl : Callback {
override fun invoke(undefined: Any?, nullable: Any?, nonNull: Any) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
如您所见,注释已被我们识别:
undefined
-可为空的类型,但用户有责任为没有注释的参数定义空安全性。如果可以保证null安全,则可以将类型更改为Any
。nullable
-可为空的类型,您不能将其类型更改为不可为空nonNull
-不可为空的类型,您不能更改其类型。尽管它很安全,但是您不能更改实现类型,这是接口的责任阅读here关于Java互操作中的注释角色