Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Android Studio中侦听器接口的默认实现包含可为空的父级?_Android_Kotlin - Fatal编程技术网

为什么Android Studio中侦听器接口的默认实现包含可为空的父级?

为什么Android Studio中侦听器接口的默认实现包含可为空的父级?,android,kotlin,Android,Kotlin,每次我在androidstudio中实现监听器接口所需的重写方法时(当我使用CTRL+I,而不是手动写入它时),父接口总是可以为空的。例如: class Location : AppCompatActivity(), RadioGroup.OnCheckedChangeListener { override fun onCheckedChanged(group: RadioGroup?, checkedId: Int) { TODO("not implemented")

每次我在androidstudio中实现监听器接口所需的重写方法时(当我使用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
不能为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.
    }
}
如您所见,注释是公认的,我们有:

  • 未定义
    -可空类型,但用户有责任为没有注释的参数定义空安全性。如果可以保证空安全性,则可以将类型更改为
    任意
  • nullable
    -可为null的类型,您不能将其类型更改为不可为null
  • nonNull
    -不可为null的类型,您不能更改它的类型。尽管它是安全的,但您不能为实现更改类型,这是接口的责任

阅读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.
    }
}
如您所见,注释是公认的,我们有:

  • 未定义
    -可空类型,但用户有责任为没有注释的参数定义空安全性。如果可以保证空安全性,则可以将类型更改为
    任意
  • nullable
    -可为null的类型,您不能将其类型更改为不可为null
  • nonNull
    -不可为null的类型,您不能更改它的类型。尽管它是安全的,但您不能为实现更改类型,这是接口的责任

阅读Java interop中的注释角色

我的猜测:接口未声明
@NotNull
,因此代码生成器采用可空类型。我的猜测:接口未声明
@NotNull
,因此代码生成器采用可空类型。