読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

総称型のinstanceof

Java

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> );
}