其他分享
首页 > 其他分享> > 优先考虑类型安全的异构容器

优先考虑类型安全的异构容器

作者:互联网

泛型的常见用法包括集合,如 Set<E > 和 Map<K,V> 和单个元素容器,如 ThreadLocal<T>
和 AtomicReference<T> 。 在所有这些用途中,它都是参数化的容器。 这限制了每个容器只能有固
定数量的类型参数。 通常这正是你想要的。 一个 Set 有单一的类型参数,表示它的元素类型; 一个
Map 有两个,代表它的键和值的类型

然而有时候,你需要更多的灵活性。 例如,数据库一行记录可以具有任意多列,并且能够以类型安
全的方式访问它们是很好的。 幸运的是,有一个简单的方法可以达到这个效果。 这个想法是参数化键
(key)而不是容器。 然后将参数化的键提交给容器以插入或检索值。 泛型类型系统用于保证值的类型
与其键一致

请考虑一个 Favorites 类,它允许其客户端保存和检索任意多
种类型的 favorite 实例。 该类型的 Class 对象将扮演参数化键的一部分。其原因是这 Class 类是
泛型的。 类的类型从字面上来说不是简单的 Class ,而是 Class<T> 。 例如, String.class 的
类型为 Class<String> , Integer.class 的类型为 Class<Integer> 。 当在方法中传递字面类
传递编译时和运行时类型信息时,它被称为类型令牌(type token)[Bracha04]

// Typesafe heterogeneous container pattern - API
public class Favorites {
public <T> void putFavorite(Class<T> type, T instance);
public <T> T getFavorite(Class<T> type);
}

下面是一个演示 Favorites 类,保存,检索和打印喜欢的 String , Integer 和 Class 实
例:

// Typesafe heterogeneous container pattern - client
public static void main(String[] args) {
Favorites f = new Favorites();
f.putFavorite(String.class, "Java");
f.putFavorite(Integer.class, 0xcafebabe);
f.putFavorite(Class.class, Favorites.class);
String favoriteString = f.getFavorite(String.class);
int favoriteInteger = f.getFavorite(Integer.class);
Class<?> favoriteClass = f.getFavorite(Class.class);
System.out.printf("%s %x %s%n", favoriteString,
favoriteInteger, favoriteClass.getName());
}

  

Favorites 的实现

// Typesafe heterogeneous container pattern - implementation
public class Favorites {
private Map<Class<?>, Object> favorites = new HashMap<>();
public<T> void putFavorite(Class<T> type, T instance) {
favorites.put(Objects.requireNonNull(type), instance);
} p
ublic<T> T getFavorite(Class<T> type) {
return type.cast(favorites.get(type));
}
}

  

泛型 API 的通常用法(以集合 API 为例)限制了每个容器的固定数量的类型参数。 你可以通
过将类型参数放在键上而不是容器上来解决此限制。 可以使用 Class 对象作为此类型安全异构容器
的键。 以这种方式使用的 Class 对象称为类型令牌。 也可以使用自定义键类型。 例如,可以有一个
表示数据库行(容器)的 DatabaseRow 类型和一个泛型类型 Column<T> 作为其键

  

标签:异构,容器,优先,class,Favorites,类型,type,Class
来源: https://www.cnblogs.com/lIllIll/p/13557561.html