是否可以从方法参数中参数化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);
答案 0 :(得分:3)
这个怎么样:
public static <T> ArrayList<T> getViewsFromViewGroup(ViewGroup root, Class<T> clazz) {
...
}
Class
是参数类型,因此您可以使用其参数在方法中指定通用参数。当然,您必须在方法体中使用T
参数 - 除非您计划使用反射,否则您甚至可以完全忽略clazz
参数。