Effective Java second editionを読む-3

Effective Java second edition、引き続きジェネリクス


「クラス名.class」で表現される「タイプトークン」ってのを知らなかった。

下記サイトのジェネリクス+タイプトークンの例に感動。
Neal Gafter's blog: Super Type Tokens
http://gafter.blogspot.com/2006/12/super-type-tokens.html

ここのFavoriteクラスの例。(以下引用)

public class Favorites {
    private Map<Class<?>, Object> favorites =
        new HashMap<Class<?>, Object>();
    public <T> void setFavorite(Class<T> klass, T thing) {
        favorites.put(klass, thing);
    }
    public <T> T getFavorite(Class<T> klass) {
        return klass.cast(favorites.get(klass));
    }
    public static void main(String[] args) {
        Favorites f = new Favorites();
        f.setFavorite(String.class, "Java");
        f.setFavorite(Integer.class, 0xcafebabe);
        String s = f.getFavorite(String.class);
        int i = f.getFavorite(Integer.class);
    }
}

上記のソースはコンパイル時の警告も出ない。クラスをキーとして、そのクラスのオブジェクトを値として保持できるリポジトリ

元ネタは2006年のJavaOneらしい。(PDFの中身は未確認)
Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle
http://developers.sun.com/learning/javaoneonline/2006/coreplatform/TS-1512.pdf