第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));

 

posted @ 2016-08-01 22:47  没有梦想的小灰灰  阅读(243)  评论(0编辑  收藏  举报