1

ArrayListメソッドパラメータからパラメータ化することは可能ですか?たとえば、レイアウトからgetAllViewsFromRoot(View root)すべてを取得するメソッドがあります。Viewsここで、レイアウト内のすべてのProgressBarを取得するメソッドが必要なので、次の(ツールキット)メソッドを使用できます。

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 に答える