簡體   English   中英

如何“投射”到通用對象並使用通用參數執行方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM