使用方法参数强类型化ArrayList

时间:2012-12-07 10:45:43

标签: java android generics casting

是否可以从方法参数中参数化ArrayList?例如,我有一个方法getAllViewsFromRoot(View root),它从布局中检索所有Views。现在我想要一个在布局中获取所有ProgressBars的方法,所以我可以使用这个(工具包)方法:

public static ArrayList<ProgressBar> getAllProgressBars(View root) {
  ArrayList<View> allviews = getAllViewsFromRoot(root);
  ArrayList<ProgressBar> results = new ArrayList<ProgressBar>();
  for (View view : allviews)
    if (view instanceof ProgressBar)
      results.add((ProgressBar)view);
  return results;
}

但是因为我需要针对不同类型的Views执行此操作,所以我想知道这是否可能以更通用的方式传递,传递方法中的类。我希望这会奏效,但事实并非如此:

public static ArrayList<?> getViewsFromViewGroup(ViewGroup root, Class clazz) {
    ArrayList<View> views = getAllViewsFromRoots(root);
    ArrayList<View> result = new ArrayList<clazz>();
    for (View view : views) {
        if (clazz.isInstance(view.getClass())) {
            result.add(view);
        }
    }
    return result;
}

在其他地方,我会打电话给ArrayList<ProgressBar> pbs = Toolkit.getViewsFromViewGroup(root, ProgressBar.class)

换句话说,我可以指定我希望如何使用方法参数强类型化ArrayList吗?

我想要的是什么?我不一定非常需要它,但我喜欢以通用的方式解决问题。

修改

我设法让代码使用下面的答案(感谢 thkala )。我怀疑它实际上更容易。

public static <T> ArrayList<T> getViewsFromViewGroup(View root, Class<T> clazz) {
    ArrayList<T> result = new ArrayList<T>();
    for (View view : getAllViewsFromRoots(root)) 
        if (clazz.isInstance(view)) 
            result.add(clazz.cast(view));
    return result;
}

因此,如果您想从布局中的某个点检索所有ProgressBars,只需调用:

ArrayList<ProgressBar> myPbs = Toolkit.getViewFromViewGroup(myRootView, ProgressBar.class);

1 个答案:

答案 0 :(得分:3)

这个怎么样:

public static <T> ArrayList<T> getViewsFromViewGroup(ViewGroup root, Class<T> clazz) {
    ...
}

Class是参数类型,因此您可以使用其参数在方法中指定通用参数。当然,您必须在方法体中使用T参数 - 除非您计划使用反射,否则您甚至可以完全忽略clazz参数。