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

2022-06-26  本文已影响0人  DZQANN
  1. 泛型最常用于集合,限制每个容器只能有固定数目的类型参数,比如Set只有一个参数,Map有两个参数。有时候会需要更多的灵活性,有一种方法可以做到这一点:将键进行参数化而不是将容器进行参数化

  2. 将键进行参数化的一个例子:

    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));
        }
    }
    
  3. Java的语法目前不支持保证上面例子里,Map的Key和Value的对应关系,所以Value只能是Object

  4. 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));
    }
    

思考

  1. 泛型类的搭建主要还是框架,而业务开发大多只是使用泛型
  2. 其实Favourites的例子,就是一个小的DI框架,将Class作为key,对应的instance作为value
  3. Favourites例子里面的Map,其实value用通配符?会更好一点
上一篇下一篇

猜你喜欢

热点阅读