Effective Java - 优先考虑类型安全的异构容器
2022-06-26 本文已影响0人
DZQANN
-
泛型最常用于集合,限制每个容器只能有固定数目的类型参数,比如
Set
只有一个参数,Map
有两个参数。有时候会需要更多的灵活性,有一种方法可以做到这一点:将键进行参数化而不是将容器进行参数化 -
将键进行参数化的一个例子:
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); } public <T> T getFavorite(Class<T> type) { return type.cast(favorites.get(type)); } }
-
Java的语法目前不支持保证上面例子里,
Map
的Key和Value的对应关系,所以Value只能是Object
。 -
Class
类有一个asSubclass
方法,可以将Class<?>
转化成Class<? extends U>
static Annotation getAnnotation(AnnotatedElement element, String annotationTypeName) { Class<?> annotationType = null; // Unbounded type token try { annotationType = Class.forName(annotationTypeName); } catch (Exception ex) { throw new IllegalArgumentException(ex); } return element.getAnnotation( annotationType.asSubclass(Annotation.class)); }
思考
- 泛型类的搭建主要还是框架,而业务开发大多只是使用泛型
- 其实Favourites的例子,就是一个小的DI框架,将
Class
作为key,对应的instance作为value - Favourites例子里面的
Map
,其实value用通配符?
会更好一点