这个版本的 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() 使用:

我想知道为什么它有效。

无法推断。它使用了一个演员 - return (T)。调用者负责确保类型 T 与所定位的视图类型相匹配。如果他们弄错了,操作将失败并显示 ClassCastException.

类型可以明确指定,即

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

(请原谅我的语法错误 - 我现在主要处理 Kotlin)

或者可以从目的地推断:

TextView foundView = findViewById(R.id.someTextView)

但无论哪种情况,责任都在于来电者。

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

它与 @IdRes 注释无关,它在那里断言 - 再次在编译时 - id 参数是对某些 [=33=基于 ] 的实体,而不仅仅是任何整数值。