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