美文网首页
Effective Java - 利用有限制通配符来提升API的

Effective Java - 利用有限制通配符来提升API的

作者: DZQANN | 来源:发表于2022-06-19 22:15 被阅读0次
  1. 泛型单例工厂

    private static final Optional<?> EMPTY = new Optional<>(null);
    
    public static<T> Optional<T> empty() {
      @SuppressWarnings("unchecked")
      Optional<T> t = (Optional<T>) EMPTY;
      return t;
    }
    
  2. 递归类型限制:public static <E extends Comparable<E>> E max(Collection<E> c)

第31条 利用有限制通配符来提升API的灵活性

  1. List<String>不是List<Object>的子类型

  2. 对于限制通配符extendssuper的选择,有PECS表示producer-extends, consumer-super

  3. 不要用有限制通配符作为函数的返回值(中文版翻译错了,翻译成了通配符)

image.png
  1. Java引入显示类型参数

    public class Union {
    
        public static <T> Set<T> union(Set<? extends T> a, Set<? extends T> b) {
            return Stream.of(a, b)
                    .flatMap(Collection::stream)
                    .collect(Collectors.toSet());
        }
    }
    
    public static void main(String[] args) {
      Set<Integer> integers = Set.of(1, 2, 3);
      Set<Double> doubles = Set.of(1.0, 2.0, 3.0);
      Set<Number> result = Union.<Number>union(integers, doubles);
    }
    
  2. 使用时ComparableComparator都是消费者,实现时最好是Comparable<? super T>Comparator<? super T>

思考

  1. 开始的时候不大需要考虑太多泛型的扩展,如果当时传入只有一种类型,不需要考虑extends或者super,直接用当时的类就可以,如果后面可能会传入子类或者父类,再扩展

  2. 其实不用过于纠结泛型的不同限制类型,先动手试一下,如果需要强转等等,再改变泛型的写法。比如之前写过入参和出参相同,是这么写的:

    public static <? extends Father> match(List<? extends Father> list) {...}
    
    public static test() {
      List<Son> sons = match(List.of(new Son())).stream()
        .map(e -> (Son) e)
        .collect(Collectors.toList());
    }
    

    后来发现这么写肯定是有问题的,就改成了这样

    public static <T> match(List<T extends Father> list) {...}
    
    public static test() {
      List<Son> sons = match(List.of(new Son()));
    }
    

    感觉泛型就像正则表达式一样,多试试就行了,不会的时候百度下

相关文章

网友评论

      本文标题:Effective Java - 利用有限制通配符来提升API的

      本文链接:https://www.haomeiwen.com/subject/wufsvrtx.html