総称型のinstanceof
instanceofでは、
- 型パラメータがついていない型(例:List)
- 上限or下限の指定のないワイルドカードが指定された型(例:List<?>)
のいずれかが指定できます。
- 具体的な型をパラメータとして持つもの(extendsやsuperを含む)は指定できません。
- →これは、実行時に型パラメータの正確な値が取得できないため、とのこと。
- 許可されている2つ(「reifiable types」と呼ばれる。)は、コンバイル時に型情報が失われないので指定可能らしい。(Java Generics FAQs : Cast and instanceofより)
Object obj = new ArrayList<Exception>(); System.out.println( obj instanceof List ); System.out.println( obj instanceof List<?> ); // これはOK // System.out.println( obj instanceof List<Exception> ); // コンバイルエラー // System.out.println( obj instanceof List<? extends Exception> ); // コンバイルエラー // System.out.println( obj instanceof List<? super Exception> ); // コンバイルエラー
実行結果です。
true true
ちなみに、こんなのもダメです。
static <X> void test( Object obj ) { // 以下はコンバイルエラー //System.out.println( obj instanceof List<? extends X> ); //System.out.println( obj instanceof List<X> ); }