无需强制转换的Android代码

无需强制转换的Android代码,android,android-layout,casting,Android,Android Layout,Casting,为什么Android代码中有这么多的强制转换? 我的代码几乎有一半都是由类型转换组成的,比如: EditText yourEditText= (EditText) findViewById(R.id.yourEditText); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 有没有更好的办法?(特别是一种可以在运行前检测错误所在的方法)因为如果要将超类型

为什么Android代码中有这么多的强制转换? 我的代码几乎有一半都是由类型转换组成的,比如:

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

有没有更好的办法?(特别是一种可以在运行前检测错误所在的方法)

因为如果要将超类型分配给特定的子类型变量,则需要将其向下转换为实际类型。Android框架的大部分来自Java泛型出现之前的时代

有没有更好的办法

如果只需要从
findViewById()
返回
视图
,请将变量类型设为a
视图

还可以使用泛型隐藏强制转换。例如:

public <T extends View> T getView(@ResInt int resId) {
    return (T) findViewById(resId);
}
并自动推断正确的类型

特别是一种可以在运行前检测出错误的方法

它仍然是运行时,如果
R.id.yourEditText
实际上不是
EditText
,您将得到
ClassCastException

对于
getSystemService()
中已经有这样的方法。为较旧的API级别实现此模式留给读者作为练习:)



当您在布局文件中替换LineairLayout->RelativeLayout并忘记在代码中执行此操作时,通常会出现强制转换错误。当我的编辑器没有显示任何错误并且代码只是编译时,运行时突然一切都中断了


请注意,Android Lint将检测到许多类似的错误,并报告“意外的强制转换”错误。

当您在布局文件中替换LineairLayout->RelativeLayout并忘记在代码中执行此操作时,大多数都是强制转换错误。当我的编辑器没有显示任何错误并且代码只是编译时,运行时突然一切都中断了
EditText yourEditText = getView(R.id.yourEditText);