ジェネリクス関数で instanceof T を使用するには


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]




> その中で 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コンパイラが何を行っているかを知ることで理解が進むこともあります。




> その中で 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コンパイラが何を行っているかを知ることで理解が進むこともあります。

