32701


androidのjavaの開発において、ジェネリクス関数で、子Viewの中で指定したクラス型と等しいものを返す関数を作成しました。  
その中で instanceof T をやりたいのですがコンパイルエラーになります。

いちお下記のように引数でクラス型を渡せば目的のことはできたんですが、やりかたとして正しいのでしょうか？

アドバイスをよろしくお願い致します。

[code]

    List<ImageView> views = Utils.getChildViews(this, ImageView.class);
    
    public static <T> List<T> getChildViews(View parent, Class<T> class_, boolean isDeep) {
      List<T> result = new ArrayList<T>();
      if (ViewGroup.class.isAssignableFrom(parent.getClass())) {
        ViewGroup parent_ = (ViewGroup)parent;
        for (int i=0, length=parent_.getChildCount(); i<length; i++) {
          View child = parent_.getChildAt(i);
          if (class_.isAssignableFrom(child.getClass()))
            result.add((T)child);
          if (isDeep && ViewGroup.class.isAssignableFrom(child.getClass()))
            result.addAll((List<? extends T>)getChildViews(child, class_, isDeep));
        }
      }
      return result;
    }
    
[/code]


CC BY-SA 3.0
2017-02-16T02:23:49.897
32699
2019-06-29T08:51:49.267
2019-06-29T08:51:49.267
9008
7212
question
android java ジェネリクス
ジェネリクス関数で instanceof T を使用するには


> その中で instanceof T をやりたいのですがコンパイルエラーになります。

Java言語仕様通りの振る舞いです。ジェネリクスの型パラメータ`T`に対して`instanceof`演算子は適用できません。

> 引数でクラス型を渡せば目的のことはできたんですが、やりかたとして正しいのでしょうか？

正しい対処方法だと思います。ジェネリクスメソッド中では型パラメータ`T`に指定された型情報は失われます（型消去; Type
Erasure）ので、`Class<T>`型オブジェクトを渡すのは妥当な解決策です。

おまけ：ジェネリクスに関する詳細情報は [Java Generics FAQs - Under The Hood Of The
Compiler](http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html)
がお勧めです。ジェネリクスを利用したいだけであればここまで理解する必要はありませんが、Javaコンパイラが何を行っているかを知ることで理解が進むこともあります。


CC BY-SA 3.0
2017-02-16T03:18:55.013
32701
2017-02-16T05:04:15.250
2017-02-16T05:04:15.250
49
49
32699
answer