.java基础-java泛型

记录一下一些知识概念,用于自己遗忘时候的查缺补漏)

1.泛型概念

泛型的出现是为了使用在集合类里面,能够针对不同的数据类型,执行相同的代码。并且在编译期间就知道数据类型,便于编译器更好的提供帮助。同时为了兼容以前的版本,泛型有类型擦除的问题。

2. 泛型的分类

一般常用的泛型有泛型类,泛型接口,泛型方法。

2.1 泛型类

在一个类声明时候,就申明泛型类型。

public class Test1<T> {
    private T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }
}

复制代码

2.2 泛型接口

在一个接口声明时候,就申明泛型类型。

public interface Test2<T> {
    T getData(T t);
}

复制代码

2.3 泛型方法

方法申明时候,就声明泛型,并且在方法体中使用的方法,泛型方法,与是不是在泛型类中毫无关系。

public class Test3 {
    public <T> T getData(T t) {
        return t;
    }
}

复制代码

3.通配符?和变换

通配符一般有三种,无界通配符,上界通配符和下界通配符。

3.1 无界通配符

采用 的形式,比如 List,无边界的通配符的主要作用就是让泛型能够接受未知类型的数据。 与T使用不同的是,T 是表示一个 确定的 类型,通常用于泛型类和泛型方法的定义, T 可以进行多重限定。使用& 符号设定多重边界。 ?是一个 不确定 的类型,通常用于泛型方法的调用代码和形参,不能用于定义类和泛型方法,使用有边界限定符可以定义泛型方法。 但是在下面这种情况下使用情况是一样的:

    // 使用T,U两种的类型
    public <T,U> void test1(List<T> dest, List<U> src){
    }
    // 通过? 来 表示两种不相关的数据类型
    public void test2(List<?> dest, List<?> src){
    }
    //通配符是 不确定的,所以这个方法不能保证两个 List 具有相同的元素类型
    public void  test3(List<? extends Number> dest, List<? extends Number> src){
    }
    // 通过 T 来 确保 泛型参数的一致性
    public <T extends Number> void test4(List<T> dest, List<T> src){
        }
复制代码

3.2 上下界限的通配符

例如,表示上限<? extends Number>,接受Number的本身和子类,<? super Int>表示下界,接受Int 的本身和上层所有父类。

         List<? extends  Number> numbers = new ArrayList<Integer>();//协变
        List<? super Integer> numbers2 = new ArrayList<Number>();//逆变

        numbers.add(Integer.valueOf("5"));//error
        Object o = numbers2.get(3);//取数据时候只能取出Object 顶层父类的数据,因为不确定此时的数据是哪个层级的父类。
复制代码

逆变和协变描述了具有继承关系的类型,通过类型构造器映射到另一范畴时所具有的继承关系。

保持原继承关系的为协变,继承关系反转的为逆变。

应该怎么理解编程语言中的协变逆变?


 

全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 17:51
点赞 评论 收藏
分享
06-13 17:33
门头沟学院 Java
顺序不记了,大致顺序是这样的,有的相同知识点写分开了1.基本数据类型2.基本数据类型和包装类型的区别3.==和equals区别4.ArrayList与LinkedList区别5.hashmap底层原理,put操作时会发生什么6.说出几种树型数据结构7.B树和B+树区别8.jvm加载类机制9.线程池核心参数10.创建线程池的几种方式11.callable与runnable区别12.线程池怎么回收线程13.redis三剑客14.布隆过滤器原理,不要背八股,说说真正使用时遇到了问题没有(我说没有,不知道该怎么回答了)15.堆的内存结构16.自己在写项目时有没有遇见过oom,如何处理,不要背八股,根据真实经验,我说不会17.redis死锁怎么办,watchdog机制如何发现是否锁过期18.如何避免redis红锁19.一个表性别与年龄如何加索引20.自己的项目的QPS怎么测的,有没有真正遇到大数量表21.说一说泛型22.springboot自动装配原理23.springmvc与springboot区别24.aop使用过嘛?动态代理与静态代理区别25.spring循环依赖怎么解决26.你说用过es,es如何分片,怎么存的数据,1000万条数据怎么写入库中27.你说用limit,那么在数据量大之后,如何优化28.rabbitmq如何批次发送,批量读取,答了延迟队列和线程池,都不对29.计网知不知道smtp协议,不知道写了对不对,完全听懵了30.springcloud知道嘛?只是了解反问1.做什么的?短信服务,信息量能到千万级2.对我的建议,基础不错,但是不要只背八股,多去实际开发中理解。面试官人不错,虽然没露脸,但是中间会引导我回答问题,不会的也只是说对我要求没那么高。面完问我在济宁生活有没有困难,最快什么时候到,让人事给我聊薪资了。下午人事打电话,问我27届的会不会跑路,还在想办法如何使我不跑路,不想扣我薪资等。之后我再联系吧,还挺想去的😭,我真不跑路哥😢附一张河科大幽默大专图,科大就是大专罢了
查看30道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务