类型安全的异构容器
Map并不能保证键和值之间的类型关系,即不能保证每个值的类型都与键的类型相同,当你考虑到这个问题时,可以尝试使用类型安全的异构容器。
package effective.xqh.generic;
import java.util.HashMap;
import java.util.Map;
/**
* 类型安全的异构容器(每个键都可以有一个不同的参数化类型)
* (Map并不能保证键和值之间的类型关系,即不能保证每个值的类型都与键的类型相同)
* @author Snway
*
*/
public class Favorites {
private Map<Class<?>, Object> favorites = new HashMap<Class<?>, Object>();
/**
* 保证key和value之间的类型关系是一致的
* @param type key
* @param instance value
* @author Snway
* @date 2012-7-6
*/
public <T> void putFavorites(Class<T> type, T instance) {
if (type == null)
throw new NullPointerException("Type is null");
favorites.put(type, type.cast(instance));
}
public <T> T getFavorites(Class<T> type) {
return type.cast(favorites.get(type));
}
/**
* @param args
* @author Snway
* @date 2012-7-6
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Favorites favorites = new Favorites();
favorites.putFavorites(String.class, "Effective Java");
favorites.putFavorites(Integer.class, 30306);
favorites.putFavorites(Class.class, Favorites.class);
String[] strArr = {"J", "a", "v", "a"};
favorites.putFavorites(String[].class, strArr); // 不能用在不可具体化的类型中,比如List<String>
//favorites.putFavorites(String.class, "Hel, World"); // key必须不一样,否则会覆盖。
String str = favorites.getFavorites(String.class);
int favoriteInteger = favorites.getFavorites(Integer.class);
Class<?> favoriteClass = favorites.getFavorites(Class.class);
String[] arr = favorites.getFavorites(String[].class);
for (String s : arr)
System.out.print(s);
System.out.println();
System.out.printf("%s %d %s%n", str, favoriteInteger, favoriteClass);
}
}