我不确定这甚至叫什么,所以很难找到答案。
我目前正在学习Java和Android开发,并注意到一种模式,其中声明的对象或变量的类型重复多次,我不明白为什么。
例如:
EditText editText = (EditText) findViewById(R.id.edit_message);
为什么必须在赋值运算符'='之前和之后声明它是一种EditText?为什么不够一次?为什么这有必要?
我来自红宝石背景,我很难绕过它。
答案 0 :(得分:3)
这是名为Type Casting
的结果 EditText
继承自View
类型。
由于您需要EditText
类型的变量,但findViewById
会返回View
类型的对象,
您必须将findViewById
的结果转换为EditText
举例说明:
View uncasted = findViewById(R.id.edit_message);
EditText casted = (EditText)uncasted;
//casting happening on right side above
答案 1 :(得分:1)
如果你看一下源代码。
1883 public View findViewById(int id) {
1884 return getWindow().findViewById(id);
1885 }
1886
返回类型为View
。由于它是EditText
对象,因此您将其转换为EditText
。
EditText editText = (EditText) findViewById(R.id.edit_message);
// this (EditText) is explicit casting
答案 2 :(得分:1)
findViewById(...)
是一个返回View
对象的方法(在您的情况下是一个名为edit_message的视图)。但是,Java会发现您需要一侧有EditText
个对象
EditText editText = ...
并在另一方返回View
... = findViewById(R.id.edit_message);
Java无法确定EditText
是否与View
兼容(但您知道EditText与View兼容,因为EditText
是类View
的子级)。
因此,为了说服Java“edit_message”实际上是EditText
对象,您必须在返回方法{{1}之前添加(EditText)
明确地强制转换 }
之后,变量findViewById(R.id.edit_message);
即使是来自editText
的{{1}}对象,也是一个完整的EditText
对象。