说说泛型吧

图文详解 Java 泛型,写得太好了! (qq.com)

10道不得不会的Java基础面试题 (qq.com)

问题引入

我们在向集合中添加元素的过程中add()方法里填入的是Object类,而Object类是所有类的父类,这就产生了一个问题——添加的类型无法统一,由此可能产生在遍历集合取出元素时类型不统一而报错。

传统的方式不能对添加到集合ArrayList中的数据类型进行约束。遍历的时候,需要进行类型转换,如果集合中的数据量较大,类型转换极大地影响程序效率。

Java 泛型(Generics) 是 JDK 5 中引入的一个新特性。

泛型提供了编译时类型安全检测机制,允许在编译时检测到非法的类型。使用泛型参数,可以增强代码的可读性以及稳定性。本质是参数化类型

  1. 把类型当作是参数一样传递
  2. <数据类型>只能是引用类型,不能是基本数据类型如int

泛型:就是一种不确定的数据类型。

常用的通配符有T、E、K、V,?

?表示不确定的java类型

T type表示一个具体的java类型

K V分别代表java键值中的key、value

E element代表元素

使用泛型的好处

1 省略了强转的代码,提高效率;

2 可以把运行时的问题提前到编译时期,编译时就检查添加元素的类型,提高了安全性。

不用泛型时 alt 用泛型时 alt

追问:什么是泛型擦除?

泛型是提供给javac编译器使用的,用于限定集合的输入类型,让编译器在源代码级别上,避免向集合中插入非法数据。但编译器编译完带有泛型的java程序后,生成的class文件中不再带有泛型信息,以此使程序运行效率不受影响,这个过程称为擦除。

JVM并不知道泛型的存在,因为泛型在编译阶段就已被处理成普通的类和方法。处理机制是通过类型擦除,擦除规则:

  • 泛型类型没有指定具体类型,使用Object作为原始类型;
  • 若有限定类型< T exnteds XClass >,使用XClass作为原始类型;
  • 若有多个限定< T exnteds XClass1 & XClass2 >,使用第一个边界类型XClass1作为原始类型;

追问:泛型的使用方式有哪几种?

泛型一般有三种使用方式:泛型类泛型接口泛型方法

1.泛型类

//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic<T>{

    private T key;

    public Generic(T key) {
        this.key = key;
    }

    public T getKey(){
        return key;
    }
}

2.泛型接口

public interface Generator<T> {
    public T method();
}

3.泛型方法

public static < E > void printArray( E[] inputArray ){
    for ( E element : inputArray ){
        System.out.printf( "%s ", element );
    }
    System.out.println();
}

追问:项目中哪里用到了泛型?

  • 自定义接口通用返回结果 CommonResult<T> 通过参数 T 可根据具体的返回类型动态指定结果的数据类型
  • 定义 Excel 处理类 ExcelUtil<T> 用于动态指定 Excel 导出的数据类型
  • 构建集合工具类(参考 Collections 中的 sort, binarySearch 方法)
重生之八股仙帝 文章被收录于专栏

曾有一千古奇人,精修八股文,成遁世之高人,彻天彻地畅游天地间。 今人皆忙忙,急于求成,岂不知八股乃道门口径,背负天人,若经熟读背诵,更能开拓智慧之门,探寻未来之路。 天下繁华,不尽长夜,唯有读书为伴,熟读八股文更是攀登高峰之路。磨砺文字,升腾智慧,唯有勤玉立志,始可破天荒,登临九重不竭之巅! 吾辈修炼之路,虽曲折荆棘,但信念不曾磨灭,唯有铭记八股精髓,方能指引灵魂归宿,成就一生辉煌!

全部评论

相关推荐

那一天的Java_J...:他本来公司就是做这个的,不就是正常的游戏客户端和服务器开发,软硬件联动,有啥恶心不恶心的,提前告诉你就是怕你接受不了,接受不了就没必要再往后走流程浪费时间,虽然这公司是一坨。
点赞 评论 收藏
分享
每晚夜里独自颤抖:要求太多的没必要理
点赞 评论 收藏
分享
评论
3
8
分享

创作者周榜

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