有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个类,在请求时初始化一些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);
        }
    }
}

这是可行的;我测试过了

但是。。。有许多对象扩展安卓.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) 个答案

  1. # 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);
    }
    
  2. # 2 楼答案

    知道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);
            }
        }
    }