从未初始化的对象中确定所需的对象类型
Determine required object type from uninitialized object
我希望我的代码能够帮助自动确定所需的对象类型。
背景:
附加小部件的代码通常如下:
TextView textView = (TextView) findViewById(R.id.textView);
然后我想检查是否已正确找到 textView 以避免错误。为此,我使用了自定义 (AttachWidgetException) 异常:
if(textView == null) throw new AttachWidgetException(name);
想法:
我决定编写一个函数来简化它,而不是为代码中的每个小部件重复这两行(DRY)。我错误地认为我可以做到这一点:
public View attachWidget(View view, int resID, String name) throws AttachWidgetException {
view = (view.getClass) findViewById(resID);
if(view == null) throw new AttachWidgetException(name);
return view;
}
从 Try 块中调用:
TextView textView = attachWidget(textView, R.id.textView, "textView");
问题:
但是,这行不通有两个原因。调用者的对象需要 TextView 而不是 View。我认为另一个原因是 view 尚未实例化,因此报告为:
java.lang.Class <capture<? extends android.view.View>
... 这不是 View 的扩展。要解决此问题,我需要将 attachWidget 中的行更改为:
view = findViewById(resID);
...呼叫线路:
TextView textView = (TextView) attachWidget(textView, R.id.textView, "textView");
… 这使得 View 输入参数无用。我们现在可以删除它。
问题:
这确实还不错,但是有没有办法做到这一点,这样我就不需要手动添加演员表了? attachWidget 能否自动判断需要return 一个TextView?我很确定我正朝着任何可能解决方案的错误方向前进。泛型会在这里以任何方式帮助我吗?
如果我在描述中使用了不正确的术语,请原谅我。我将不胜感激任何代码/术语/方法更正。
当视图为 null
时,您无法调用 view.getClass
。尝试这样做:
public <T extends View> T attachWidget(Class<T> type, int resID, String name) throws AttachWidgetException {
View view = findViewById(resID);
if (view == null) throw new AttachWidgetException(name);
try {
return type.cast(view);
} catch (ClassCastException) {
e.printStackTrace();
throw new AttachWidgetException(name);
}
}
在这种情况下,您可以这样调用:
TextView textView = attachWidget(TextView.class, R.id.textView, "textView");
我希望我的代码能够帮助自动确定所需的对象类型。
背景:
附加小部件的代码通常如下:
TextView textView = (TextView) findViewById(R.id.textView);
然后我想检查是否已正确找到 textView 以避免错误。为此,我使用了自定义 (AttachWidgetException) 异常:
if(textView == null) throw new AttachWidgetException(name);
想法:
我决定编写一个函数来简化它,而不是为代码中的每个小部件重复这两行(DRY)。我错误地认为我可以做到这一点:
public View attachWidget(View view, int resID, String name) throws AttachWidgetException {
view = (view.getClass) findViewById(resID);
if(view == null) throw new AttachWidgetException(name);
return view;
}
从 Try 块中调用:
TextView textView = attachWidget(textView, R.id.textView, "textView");
问题:
但是,这行不通有两个原因。调用者的对象需要 TextView 而不是 View。我认为另一个原因是 view 尚未实例化,因此报告为:
java.lang.Class <capture<? extends android.view.View>
... 这不是 View 的扩展。要解决此问题,我需要将 attachWidget 中的行更改为:
view = findViewById(resID);
...呼叫线路:
TextView textView = (TextView) attachWidget(textView, R.id.textView, "textView");
… 这使得 View 输入参数无用。我们现在可以删除它。
问题:
这确实还不错,但是有没有办法做到这一点,这样我就不需要手动添加演员表了? attachWidget 能否自动判断需要return 一个TextView?我很确定我正朝着任何可能解决方案的错误方向前进。泛型会在这里以任何方式帮助我吗?
如果我在描述中使用了不正确的术语,请原谅我。我将不胜感激任何代码/术语/方法更正。
当视图为 null
时,您无法调用 view.getClass
。尝试这样做:
public <T extends View> T attachWidget(Class<T> type, int resID, String name) throws AttachWidgetException {
View view = findViewById(resID);
if (view == null) throw new AttachWidgetException(name);
try {
return type.cast(view);
} catch (ClassCastException) {
e.printStackTrace();
throw new AttachWidgetException(name);
}
}
在这种情况下,您可以这样调用:
TextView textView = attachWidget(TextView.class, R.id.textView, "textView");