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

时间:2019-03-31 20:54:00

标签: android kotlin

每次我在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不能为空吗?

1 个答案:

答案 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互操作中的注释角色