![](/img/trans.png)
[英]How to pass generic Object as a Generic parameter on other method in java?
[英]How to 'cast' to a generic object and execute method with generic parameter
我有一個用於在請求某些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
}
如果是,怎么辦? 如果沒有,那將是一種解決方法?
這樣的事情怎么樣:
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);
}
知道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);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.