Eclipse 3.2.1

論文締め切り間近。書くたびにはてな記法を思い出せない…

Eclipseのバージョンあげたら論文に使うプログラムが動かなくなりました。

@3.2.0
<T> void t(T obj) {
    obj.getClass(); // -> Class<T>
}
@3.2.1
<T> void t(T obj) {
    obj.getClass(); // -> Class<? extends Object>
}

3.2.1からJava APIに従うようになった模様で、Object#getClass()の戻り値がClass< ? extends X>(ただしXはレシーバオブジェクトの型にイレイジャ変換をかけたもの)になった模様。
確かに>に対してClass< ? extends List>になるのがアレなのは分からなくもないですが、せめてClass< ? extends List>にはなってほしいなぁ…

なにがしたかったかというと、

class Hoge<E extends Foo> {
    Map<E, E> map;
    ...
    <T extends E> T t(T obj) {
        // 同値オブジェクトの正規化
        E normalized = map.get(obj);
        return obj.getClass().cast(normalized);
    }
}

3.2.0までは「obj.getClass()」がClassを返したのでokだったのですが、3.2.1からちゃんとイレイジャ変換かけてClass< ? extends Foo>を返してくれるので「obj.getClass().cast(normalized)」はFoo型にキャストorz
まぁ、Tがraw型とは限らないので正しい動作なんですがね

結局↓

@SuppressWarnings("unchecked")
<T extends E> T t(T obj) {
    E normalized = map.get(obj);
    return (T) normalized;
}

さっさと終わりにしてIrenka書きたいのですよ…