【发布时间】:2019-03-12 11:04:00
【问题描述】:
我是 Android 开发和 Kotlin 的新手。
我正在学习第一个使用 Kotlin 的 Android 教程,并且我有这个方法调用:
val editText = findViewById<EditText>(R.id.editText)
其中findViewById 在android.app.Activity 中定义为:
@Nullable
public <T extends View> T findViewById(@IdRes int id)
Android Studio 告诉我editText 被推断为EditText! 类型。我阅读了有关 Java 互操作性和平台类型的 Kotlin 文档,但由于 findViewById 使用 android.annotation.Nullable 进行了批注,这是支持的可空性批注列表中的 (according to Kotlin documentation),我预计 editText 类型会被推断为EditText?.
如果我将代码更改为:
val editText = findViewById<EditText?>(R.id.editText)
但为什么需要这样做而 @Nullable 却被忽略了?
【问题讨论】:
-
该方法可以为空,而不是类规范。我很确定 Kotlin 在内部将
findViewById转换为括号中的内容。 -
您自己在
findViewById<EditText>(R.id.editText)中输入了EditText吗?还是 IDE 自动完成的? -
@CommonsWare 有什么不同吗?
-
如果你自己输入,那么你就是说
findViewById()返回EditText而不是EditText?。 Kotlin 不会推翻您,因为它假定您知道自己在做什么。相反,如果您是从某个工具获得的,那么该工具可能存在错误,它应该注意@Nullable注释。
标签: android kotlin type-inference