我有一个类,在请求它们时初始化一些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
}
如果是,怎么样?如果没有,那将是一种解决方法?
答案 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);
}
}
}