文档章节

泛型

xiongsheng
 xiongsheng
发布于 2017/08/22 19:15
字数 427
阅读 18
收藏 0

声明中存在一个或者多个参数类型的类或者接口叫做泛型类或者接口。

无限制的通配符类型:?

有限制的通配符类型: ? extends E 

原生态类型:List  

List 和 List<?> : 通配符类型是安全的,原生态类型是不安全的,原生态代表可以将任何类型的数据放进去,但是通配符就不能。

不要在新代码中使用原生态类型,这条规则有两个例外。

1、在类文字中必须使用原生态类型。

    List.class  String[].class  Test.class 等等合法  但是List<?>.class 则不合法

2、<E extends Numer> 要求实际的参数类型E必须是Numer的一个子类型,包括自身。

3、泛型方法

    public static <E> Set<E> union (Set<E> s1,Set<E> s2){...}

                         <E> 代表类型参数列表

                          Set<E> 代表返回类型

4、递归类型限制。

    通过某个包含该类型参数本身的表达式来限制类型参数是允许的,这就是递归类型限制。

5、PECS原则:

  • 如果要从集合中读取类型T的数据,并且不能写入,可以使用 ? extends 通配符;(Producer Extends)
  • 如果要从集合中写入类型T的数据,并且不需要读取,可以使用 ? super 通配符;(Consumer Super)
  • 如果既要存又要取,那么就不要使用任何通配符。

jdk 源码示例:

  •     public static <T> void copy(List<? super T> dest, List<? extends T> src) {
            int srcSize = src.size();
            if (srcSize > dest.size())
                throw new IndexOutOfBoundsException("Source does not fit in dest");
    
            if (srcSize < COPY_THRESHOLD ||
                (src instanceof RandomAccess && dest instanceof RandomAccess)) {
                for (int i=0; i<srcSize; i++)
                    dest.set(i, src.get(i));
            } else {
                ListIterator<? super T> di=dest.listIterator();
                ListIterator<? extends T> si=src.listIterator();
                for (int i=0; i<srcSize; i++) {
                    di.next();
                    di.set(si.next());
                }
            }
        }

     

 

© 著作权归作者所有

xiongsheng
粉丝 2
博文 68
码字总数 35128
作品 0
程序员
私信 提问

暂无文章

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部