好文推荐,请阅读此文:Java泛型最佳实践
总结:
泛型类
泛型接口
泛型函数
通配符
通配符是为了让Java
泛型支持范围限定,这样使得泛型的灵活性提升,同时也让通用性设计有了更多的空间。
<?>
:无界通配符,即类型不确定,任意类型<? extends T>
:上边界通配符,即?
是继承自T
的任意子类型,遵守只读不写<? super T>
:下边界通配符,即?
是T
的任意父类型,遵守只写不读
上边界通配符只读不写,下边界通配符只写不读到底是什么意思,用最简单的话来说
<? extends T>
上边界通配符不作为函数入参,只作为函数返回类型,比如List<? extends T>
的使用add
函数会编译不通过,get
函数则没问题<? super T>
下边界通配符不作为函数返回类型,只作为函数入参,比如List<? super T>
的add
函数正常调用,get
函数也没问题,但只会返回Object
,所以意义不大
什么时候用通配符,如果参数泛型类即要读也要写,那么就不推荐使用,使用正常的泛型即可,如果参数泛型类只读或写,就可以根据原则采用对应的上下边界,是不是十分简单,最后再说一次读写的含义,这块确实很容易晕
- 读:所谓读是指参数泛型类,泛型只作为该参数类的函数返回类型,那这个函数就是读,
List
作为参数泛型类,它的get
函数就是读 - 写:所谓写是指参数泛型类,泛型只作为该参数类的函数入参,那这个函数就是写,
List
作为参数泛型类,它的add
函数就是写