1

是否可以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;
}

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

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

1 回答 1

3

这个怎么样:

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

Class是参数类型,因此您可以使用它的参数来指定方法中的泛型参数。自然,您将不得不T在方法主体中使用参数 - 除非您打算使用反射,否则您甚至可以完全忽略该clazz参数。

于 2012-12-07T10:50:42.980 回答