如何“强制转换”为通用对象并使用泛型参数执行方法

时间:2013-04-29 18:35:50

标签: java android generics

我有一个类,在请求它们时初始化一些GUI组件:

public class ComponentInitializer<T extends View>

public abstract void initialize(T object);

现在这里是初始化所有组件的片段:

private <T extends View> void initComponents(View view) {
    // ArrayList<Component<? extends View>> this.componentInitializers
    for (ComponentInitializer<? extends View> initializer : this.componentInitializers) {
        View object = view.findViewById(initializer.getResourceId());

        if (object instanceof CheckBox) {
            ((ComponentInitializer<CheckBox>) initializer).initialize((CheckBox) object);
        }
        else if (object instanceof RadioButton) {
            ((ComponentInitializer<RadioButton>) initializer).initialize((RadioButton) object);
        }
        else if (object instanceof EditText) {
            ((ComponentInitializer<EditText>) initializer).initialize((EditText) object);
        }
    }
}

有效;我测试了它。

但是......有许多对象延伸android.view.View而且我懒得为每个扩展View的对象创建一个代码块。

else if (object instanceof ObjectExtendingView) {
    ((ComponentInitializer<ObjectExtendingView>) initializer).initialize((ObjectExtendingView) object);
}

以某种方式可以将代码片段简化为一元一样的语句,就像这样:

for (ComponentInitializer<? extends View> initializer : this.componentInitializers) {
    initializer.initialize(object); // Maybe with some casts
}

如果是,怎么样?如果没有,那将是一种解决方法?

2 个答案:

答案 0 :(得分:1)

这样的事情怎么样:

private void initComponents(View view) {
    for (ComponentInitializer<? extends View> initializer : this.componentInitializers) {
        helper(initializer, view);
    }
}

private static <T extends View> void helper(ComponentInitializer<T> initializer, View view) {
        T object = (T)view.findViewById(initializer.getResourceId());
        initializer.initialize(object);
}

答案 1 :(得分:0)

知道T扩展View,您可以安全地将对象转换为T。然后将调用相应的方法。这应该有效:

private <T extends View> void initComponents(T view) {
    for (ComponentInitializer<? extends View> initializer : this.componentInitializers) {
        T object = (T) view.findViewById(initializer.getResourceId());
        if (object != null) {
            ((ComponentInitializer<T>) initializer).initialize((T) object);
        }
    }
}
相关问题