这个版本的 findViewById() 是如何工作的?
How does this version of findViewById() work?
This version of View.findViewById()
returns View
最具体的子类型:
protected <T extends View> T findViewById(@IdRes int id) {
return (T) getRootView().findViewById(id);
}
它是如何工作的? 具体来说,当在运行时查找 id
时,如何在 compile-time 推断出类型?跟注解有关系吗?
这与标题相似的问题不同,后者是关于 findViewById()
的 使用:
How does findViewById work?
我想知道为什么它有效。
无法推断。它使用了一个演员 - return (T)
。调用者负责确保类型 T 与所定位的视图类型相匹配。如果他们弄错了,操作将失败并显示 ClassCastException
.
类型可以明确指定,即
this.<TextView>findViewById(R.id.someTextView)
(请原谅我的语法错误 - 我现在主要处理 Kotlin)
或者可以从目的地推断:
TextView foundView = findViewById(R.id.someTextView)
但无论哪种情况,责任都在于来电者。
Android 工具链可能会做进一步的工作以交叉引用布局 XML 与代码,并在您的 IDE 中产生警告或失败,但这是编译时Java 在运行时执行的操作之上的层。
它与 @IdRes
注释无关,它在那里断言 - 再次在编译时 - id
参数是对某些 [=33=基于 ] 的实体,而不仅仅是任何整数值。
This version of View.findViewById()
returns View
最具体的子类型:
protected <T extends View> T findViewById(@IdRes int id) {
return (T) getRootView().findViewById(id);
}
它是如何工作的? 具体来说,当在运行时查找 id
时,如何在 compile-time 推断出类型?跟注解有关系吗?
这与标题相似的问题不同,后者是关于 findViewById()
的 使用:
How does findViewById work?
我想知道为什么它有效。
无法推断。它使用了一个演员 - return (T)
。调用者负责确保类型 T 与所定位的视图类型相匹配。如果他们弄错了,操作将失败并显示 ClassCastException
.
类型可以明确指定,即
this.<TextView>findViewById(R.id.someTextView)
(请原谅我的语法错误 - 我现在主要处理 Kotlin)
或者可以从目的地推断:
TextView foundView = findViewById(R.id.someTextView)
但无论哪种情况,责任都在于来电者。
Android 工具链可能会做进一步的工作以交叉引用布局 XML 与代码,并在您的 IDE 中产生警告或失败,但这是编译时Java 在运行时执行的操作之上的层。
它与 @IdRes
注释无关,它在那里断言 - 再次在编译时 - id
参数是对某些 [=33=基于 ] 的实体,而不仅仅是任何整数值。