天天看点

《JavaSE 基础知识》泛型的基本介绍和应用。

目录

​​一、泛型的基本介绍​​

​​1、传统方法存在的问题​​

​​2、泛型的基本介绍​​

​​3、泛型的语法​​

​​4、泛型的好处​​

​​二、自定义泛型​​

​​1、注意事项​​

​​2、自定义泛型方法​​

​​ 三、自定义泛型接口​​

​​ 四、泛型的继承和通配符​​

​​ 五、JUnit ​​

一、泛型的基本介绍

1、传统方法存在的问题

  • 不能对加入到集合 ArrayList中的数据类型进行约束(不安全)
  • 遍历的时候, 需要进行类型转换,如果集合中的数据量较大,对效率有影响

2、泛型的基本介绍

  1. Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
  2. 用在类声明或实例化时来指定好需要的具体的类型。
  3. Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。 同时, 代码更加简洁、 健壮。
  4. 泛型的作用是: 可以在类声明时通过一个标记符来表示类中某个属性的类型,或者是某个方法的返回值的类型,或者是参数类型。
  • 注意:                                                                                                                              1、泛型的类型参数只能是类类型(包括自定义类), 不能是简单类型。

    2、 同一种泛型可以对应多个版本(因为参数类型是不确定的), 不同版本的泛型类实例是不兼容的。

    3、泛型的类型参数可以有多个。

    4、泛型的参数类型可以使用extends语句

    5、泛型的参数类型还可以是通配符类型。

3、泛型的语法

(1)声明:
interface 接口<T>{

}      
public class 类名<K,V>{

}      
 java 中泛型常见标记符:
  • E- Element (在集合中使用,因为集合中存放的是元素)
  • T- Type(Java 类)
  • K- Key(键)
  • V- Value(值)
  • N- Number(数值类型)
  • ?- 表示不确定的 java 类型
注意:
  • 其中的 T,K,V 等不代表值,而是表示类型。不是只有这几个标记符,任意字母(大写)都可以。 常用T表示,是Type的缩写。
  • 在指定泛型具体类型后,可以传入该类类型或者该类的子类类型
  • 泛型使用形式:List<lnteger> list1 = new ArrayList<lnteger>() ;                                                            List<Integer> list2= new ArrayList<>() ;//推荐使用
  • 如果我们这样写 List list3 = new ArrayList() ,默认给它的泛型是(<E> E就是Object类) ,即:List<Object> list3 = new ArrayList<>()
(2)实例化:( 要在类名后面指定类型参数的值(类型))
List<String> strList = new ArrayList<String>()      
Iterator<Customer> iterator = customers.iterator()      

4、泛型的好处

  • 类型安全。泛型的主要目的就是提高Java程序的类型安全。 通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设只能我们自己记或者代码注释。
  • 消除强制类型转换。泛型一个附带好处是,消除代码中许多强制类型的转换。减少代码出错率, 更好阅读。即减少类型转换的次数,提高效率。
  • 潜在的性能优化。在泛型的初始实现中,编译器强制类型转换(没有泛型的话,程序员会指定这些强制类型转换,)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为以后的JVM可以带来更好的优化。由于泛型的实现方式, 支持泛型几乎不需要JVM或类文件更改,所有工作都在编译器中完成, 编译器生成的类没有泛型(和强制类型转换) 只是来确保数据类型安全。即编译时,检查添加元素的类型,提高了安全性。

二、自定义泛型

1、注意事项

  • 普通成员可以使用泛型(比如:属性、方法)
  • 使用泛型的数组, 不能初始化。因为数组在创建对象时不能确定泛型的类型,就无法在内存中开辟空间,所以不能初始化
  • 静态方法中不能使用类的泛型。因为静态是和类相关的,在类加载时,对象还没有创建

    ;所以,如果静态方法和静态属性使用了泛型,JVM就无法完成初始化

  • 泛型类的类型, 是在创建对象时确定的(因为创建对象时,需要指定确定类型)
  • 如果在创建对象时, 没有指定类型,默认为Object

2、自定义泛型方法

  • 泛型方法,可以定义在普通类中,也可以定义在泛型类中
  • 当泛型方法被调用时,类型就会确定
  • public void eat(E e) { },修饰符后没有<T,R......> eat 方法不是泛型方法,而是使用了泛型。public(修饰符)后定义泛型就是泛型方法,而public void eat(方法名)后定义泛型是方法使用了泛型。

 三、自定义泛型接口

  • 接口中,静态成员也不能使用泛型(这个和泛型类规定一样)
  • 泛型接口的类型, 在继承接口或者实现接口时确定
  • 没有指定类型, 默认为Object

 四、泛型的继承和通配符

  • 泛型不具备继承性
  • <?> : 支持任意泛型类型
  • <? extends A> : 支持A类以及A类的子类,规定了泛型的上限(?<= A类)
  • <? super A> : 支持A类以及A类的父类,不限于直接父类,规定了泛型的下限(?>= A类)

 五、JUnit 

1、什么是JUnit ?
  • JUnit是一个Java语言的单元测试框架
  • 多数Java的开发环境都已经集成了JUnit作为单元测试的工具
2、为什么需要JUnit ?
  • 一个类有很多功能代码需要测试, 为了测试, 就需要写入到main方法中
  • 如果有多个功能代码测试, 就需要来回注销, 切换很麻烦
  • 如果可以直接运行一个方法,就方便很多,并且可以给出相关信息,就好了,因此需要JUnit

3、使用方法

(1)第一步:将鼠标放在@Test 处

《JavaSE 基础知识》泛型的基本介绍和应用。

(2)第二步:使用快捷键 :alt + enter

(3)第三步:点击JUnit.5.8.1 或者有些是JUnit.5.8 (没有就选择有5的那个选项)

《JavaSE 基础知识》泛型的基本介绍和应用。
(4)第四步:不用动,点击OK即可
《JavaSE 基础知识》泛型的基本介绍和应用。