This version的 View.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/