从未初始化的对象中确定所需的对象类型

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");