为什么Android Studio中侦听器接口的默认实现包含可为空的父级?
每次我在androidstudio中实现监听器接口所需的重写方法时(当我使用CTRL+I,而不是手动写入它时),父接口总是可以为空的。例如:为什么Android Studio中侦听器接口的默认实现包含可为空的父级?,android,kotlin,Android,Kotlin,每次我在androidstudio中实现监听器接口所需的重写方法时(当我使用CTRL+I,而不是手动写入它时),父接口总是可以为空的。例如: class Location : AppCompatActivity(), RadioGroup.OnCheckedChangeListener { override fun onCheckedChanged(group: RadioGroup?, checkedId: Int) { TODO("not implemented")
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
不能为null吗?自动生成的实现期望可为null的参数的原因是,对于没有@NonNull
注释的参数,更安全的做法是期望Java(对于Java定义的方法)提供可为null的类型。但对于带有注释参数的方法,将根据注释生成实现
假设我们有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.
}
}
如您所见,注释是公认的,我们有:
-可空类型,但用户有责任为没有注释的参数定义空安全性。如果可以保证空安全性,则可以将类型更改为未定义
任意
-可为null的类型,您不能将其类型更改为不可为nullnullable
-不可为null的类型,您不能更改它的类型。尽管它是安全的,但您不能为实现更改类型,这是接口的责任nonNull
阅读Java interop中的注释角色,了解自动生成的实现期望可为null的参数的原因对于不带
@NonNull
注释的参数,从Java(对于Java定义的方法)期望可为null的类型更安全。但对于带有注释参数的方法,将根据注释生成实现
假设我们有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.
}
}
如您所见,注释是公认的,我们有:
-可空类型,但用户有责任为没有注释的参数定义空安全性。如果可以保证空安全性,则可以将类型更改为未定义
任意
-可为null的类型,您不能将其类型更改为不可为nullnullable
-不可为null的类型,您不能更改它的类型。尽管它是安全的,但您不能为实现更改类型,这是接口的责任nonNull
阅读Java interop中的注释角色我的猜测:接口未声明
@NotNull
,因此代码生成器采用可空类型。我的猜测:接口未声明@NotNull
,因此代码生成器采用可空类型。