java - 这个版本的 findViewById() 是如何工作的?

标签 java android generics annotations findviewbyid

This versionView.findViewById()返回 View 的最具体的具体子类型:

protected <T extends View> T findViewById(@IdRes int id) {
    return (T) getRootView().findViewById(id);
}

它是如何工作的?具体来说,当在运行时查找 id 时,如何在编译时推断类型?跟注解有关系吗?

这与标题相似的问题不同,后者是关于findViewById()使用:

我想知道为什么它有效。

最佳答案

无法推断。它使用强制转换 - return (T)。调用者负责确保类型 T 与所定位的 View 类型相匹配。如果他们弄错了,操作将失败并返回 ClassCastException

类型可以明确指定,即

this.<TextView>findViewById(R.id.someTextView)

(请原谅我的语法,如果我弄错了 - 我现在主要处理 Kotlin)

或者可以从目的地推断:

TextView foundView = findViewById(R.id.someTextView)

但无论哪种情况,责任都在于调用者。

Android 工具链可能会做进一步的工作,将布局 XML 与代码交叉引用,并在您的 IDE 中产生警告或故障,但这是 Java 在运行时执行的操作之上的编译时层。

它与 @IdRes 注释无关,它用于断言 - 再次在编译时 - id 参数是对 ID 的引用一些基于 XML 的实体,而不仅仅是任何整数值。

关于java - 这个版本的 findViewById() 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54894446/

相关文章:

java - 如何在 Servlet doPOst 上使用 JSP?

android - OpenGL ES 2.0 指定位置属性 vec3 或 vec4

javascript - 如何在 Rhino 脚本中实例化 java 泛型类?

Java 泛型接口(interface)和 Spring GetBean 按 Id 和类类型

java - Generic 的实例作为方法参数

java - 有异常的接口(interface)扩展无异常的接口(interface)

java - 如何否定方法引用谓词

java - 程序编译但无法运行,无法使用构造函数

java - 使用 .clear() *JAVA* *ANDROID* 清除文本字段时遇到问题

android - 如何使用语音交互打开 Activity ?