境界ワイルドカード

http://wisdom.sakura.ne.jp/programming/java/java5_3.html


Saisseさんに教えていただきました。上の問題(というか無知)を解決する書き方↓

List<Integer> nn = new ArrayList<Integer>();
List<? extends Number> nn2 = nn;

オーバーライドする場合の例

class X{
    List<? extends Number> hoge(){
        return null;
    }
}
class Y extends X{

    List<Integer> hoge(){
        return null;
    }
}

去年作ったプログラムですごい無駄な書き方してたわ。はずかし。

追記

一方でワイルドカードの型変数に対して代入する行為はコンパイラによって禁止されます。

そうです。こういうコードはコンパイルエラー。

List<Integer> nn = new ArrayList<Integer>();
List<? extends Number> nn2 = nn;
nn2.add(1.0);//Doubleを代入
int n = nn2.get(0) + 1;//DoubleをとってIntegerにキャスト

これがコンパイルエラーにならないと、実行時にClassCastExceptionになっちゃう。