第29条:优先考虑类型安全的异构容器
一个Set只有一个类型参数,表示它的元素类型,一个Map有两个类型参数,表示它的键和值类型。
但是有时候,需要更多的灵活性,如,数据库行有任意多的列,希望能以类型安全的方式访问所有的列。办法是将键进行参数化而不是将容器参数化,然后将参数化的键提交给容器,来插入或者获取值。用泛型系统来确保值的类型与它的键相符。
例子:
public class Favorites { private Map<Class<?>, Object> favorites = new HashMap<Class<?>, Object>(); public <T> void putFavorites(Class<T> type, T instance) { if(type == null) throw new NullPointerException(); favorites.put(type, type.cast(instance)); } public <T> T getFavorites(Class<T> type) { return type.cast(favorites.get(type)); } }
Class对象充当参数化键的部分,从java1.5开始,类的类型不再是简单的Class,而是Class<T>。当一个类的字面文字被用在方法中,来传达编译时和运行时的类型信息,就被称作type token,类型令牌。
检验代码:
Favorites f = new Favorites(); f.putFavorites(String.class, "Java"); f.putFavorites(Integer.class, 123); System.out.println(f.getFavorites(String.class)); System.out.printf("%x", f.getFavorites(Integer.class));