Java 为什么将(EditText)findViewById强制转换为(EditText)?

Java 为什么将(EditText)findViewById强制转换为(EditText)?,java,android,Java,Android,我开始学习Android编程。当您声明类型为EditText的对象并稍后初始化它们时,为什么要将findViewById的内容强制转换为EditText findViewById返回哪些需要强制转换的内容 正如daniel_c05所指出的,findViewById返回类型是View(它是EditText的父类和其他视觉小部件的类) 在Java中,在这种情况下需要强制转换为特定类型—这是该语言的要求。findViewById从onCreate(Bundle)中处理的XML中查找由id属性标识的视图

我开始学习Android编程。当您声明类型为
EditText
的对象并稍后初始化它们时,为什么要将
findViewById
的内容强制转换为
EditText


findViewById
返回哪些需要强制转换的内容

正如daniel_c05所指出的,
findViewById
返回类型是
View
(它是
EditText
的父类和其他视觉小部件的类)


在Java中,在这种情况下需要强制转换为特定类型—这是该语言的要求。

findViewById从onCreate(Bundle)中处理的XML中查找由id属性标识的视图。
请参阅-:

我不知道您有多少不同语言的编程经验。但在许多语言中,这是一个相当常用的概念。这几乎是非常合乎逻辑的。让我用两种方法来解释这一点:-

1) 如果你有C语言的编码经验,你会发现它非常相似。所以,在C中,假设当您使用malloc()分配一块内存时,您只需说

malloc(numberOfBytesYouNeed);
现在malloc所做的是为您保留请求的字节数(如果可用),并返回一个void*,指向分配的内存块的起始地址

现在,尽管带着void指针,但仍然希望访问以某种方式分配的内存。正确的?因此,您可能希望以2(整数)或1(字符)等比例因子访问分配的内存

此外,只有将malloc()返回的指针分配给自己的一个指针,您才能访问它。正如我前面提到的,如果你想在新分配的内存中存储2字节的整数,那么要访问这个整数内存数组,你需要一个整数指针

由于需要整数指针,因此必须将malloc()返回的void指针分配给整数指针。类似这样的:

int * myPointer= malloc(numberOfBytesYouNeed);
但根据语言语义,这将是一个编译时错误。因为您只能为彼此分配相似的指针

因此,您需要将malloc()返回的void*类型转换为int*。大概是这样的:-

现在Android(或任何其他编程语言)中的概念也类似。如上所述,findViewById返回类型为View(它是EditText的父类,也是可视小部件的其他类)。但是,由于您实际上希望访问findViewById作为EditText对象返回的这个视图对象,所以您需要将其类型转换为一个

2) 另一个例子是非常基本的。假设你只会说德语。现在你碰巧遇到一个只会说印地语的辣妹。但她懂德语。现在,如果你用德语问她,如果她有兴趣和你约会,她肯定会理解的。但由于她不会说德语,她会用印地语回复。即使她的回答是肯定的,对你也没有多大用处。这里您需要的是一名翻译人员将她的答案(用印地语(视图对象)转换为您能理解的内容,即德语(EditText对象)


希望答案有帮助

从API 26开始,可能不再需要强制转换。现在的国家

注意:在大多数情况下(取决于编译器支持),结果 视图将自动转换为目标类类型。如果目标 类类型不受约束,可能需要显式强制转换

这是因为返回类型现在为:

<T extends View> T  findViewById(int id)
T findViewById(int-id)

中所述,findViewById返回视图类型的对象。因此,在调用它时,需要将其转换为适当的类型。见参考资料:
<T extends View> T  findViewById(int id)