编译软件:IDEA 2019.2.4 x64
运行环境:win10家庭中文版
jdk版本:1.8.0_361
提示:以下为本文正文,以下案例供参考
1.什么是通用型?
首先我们看一下百度百科中关于“泛型”的权威解释,如下。
Java 泛型是 J2 SE1.5 中引入的新功能。 它的本质是参数化类型,即将操作的数据类型指定为参数(类型)。 这种参数类型可以用在类、接口和方法的创建中,它们被称为泛型类、泛型接口和泛型方法。
--------------------------百度百科
怎么说? 解释非常简洁、高效、准确。 但对于初学者来说,可能过于专业,难以理解。 你不妨看一下这篇文章,它可能会让你对泛型有一个大致的了解和即时的了解。
在向您解释之前,我没有查看以下问题场景:
假设有一批空塑料瓶,设计是要送到矿泉水公司购买矿泉水,但这些塑料瓶没有标签[标签是收货人的信息]。 塑料瓶生产商并不知道这批塑料瓶是否会发往矿泉水公司或其他饮料公司。 也就是说,制造商可能会发送错误的产品。 在上述问题场景中,假设塑料瓶瓶身贴有标签,塑料瓶制造商就不会犯发错产品的错误,矿泉水公司也能如期收到产品。
显然,标签在确保发货人和收货人能够按时准确地发送/接收产品方面发挥着巨大作用。 从而提高生产效率。
泛型有点像上面场景中的“标签”。 您可以在使用某个xx之前命名它的类型。 使用方便、安全。
对于Java程序来说,它起到以下作用。
(1)类型检查可以参考“编译时”
(2)使用时类型安全,不需要强制类型转换。
泛型如何传递类型?
我们可以利用以前的知识来帮助理解它。 之前学习方法的时候,我们有形式参数和实参的概念。
为什么方法有参数?
因为方法体的功能实现需要外界(用户)为其提供数据,所以数据值在方法体编写时是不确定的,需要在方法调用时确定。
例如:编写一个可以求两个整数之和的方法。
public static int add(int a, int b){ int a; int b; return a + b; }
现在设计某个类的时候,某个成员的类型是未知的,使用这个类的时候需要确定,并且这个类型可以作为参数传递。
写在类名后面,如下代码和示例所示:
public class ArrayList{//E就是代表未知的类型,又称为类型形参 public void add(E e) //添加一个元素到当前集合中 //... } } ArrayListlist = new ArrayList //(); 就是对应
总结:泛型是参数化类型,即泛型是传递类型的语法
格式:
2. 通用相关术语解释
示例如下:
E是类型变量,因为E是未知类型,可能代表、可能代表等等,并且可以改变,所以称为类型变量。
是一个类型参数。
是参数化类型。
注意:类型变量也称为泛型变量,类型参数也称为泛型实参
3. 泛型可以在哪里声明? 3.1 在类或接口名称后面,这样的类和接口称为泛型类或泛型接口,或参数化类型
代码如下(示例):
java.lang.Comparable接口 public interface Comparable{ public int compareTo(T o); //这个不是泛型方法 }
3.2 在方法的返回值类型前面,这样的方法称为泛型方法。
代码如下(示例):
java.util.Arrays类: publif staticList return new ArrayList<>(a); }asList(T... a) {
注意: 、 等泛型类型只能指定为引用数据类型,不能指定为基本数据类型和void。
3.3 示范案例
案例演示代码:
@Test public void test01(){ Collectioncoll=new ArrayList for (int i = 0; i <5 ; i++) { coll.add(new Random().nextInt(100)); } for (Integer integer : coll) { System.out.print(integer+"\t"); } System.out.println(); coll.removeIf(new Predicate(); () { @Override public boolean test(Integer integer) { return integer%2==0; } }); Iteratoritr= coll.iterator(); while (itr.hasNext()){ System.out.print(itr.next()+"\t"); } }
运行结果:
4、如何自定义泛型类和泛型接口? 4.1 应用概述
当我们在类或者接口中定义一个成员时,该成员的相关类型是不确定的,并且在使用这个接口时需要很难确定这个类型,那么我们就可以使用泛型。
语法格式:
注意
:可以是一个或多个类型变量,通常用单个大写字母表示。 例如: 等。 in 中的类型变量不能用在静态成员上。
例子:
例如:我们要声明一个班级的学生,学生包含姓名和成绩,但是此时学生的成绩类型是不确定的,为什么呢,因为语文老师希望成绩是“优秀”、“好”、“及格”、“不及格”,数学老师希望成绩是89.5、65.0,英语老师希望成绩是'A'、'B'、'C'、'D'、'E' 。 那么我们在设计这个学生类的时候就可以使用泛型了。
示例演示代码:
public class Student{ private String name; private T score; public Student(String name, T score) { this.name = name; this.score = score; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", score=" + score + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public T getScore() { return score; } public void setScore(T score) { this.score = score; } }
注意上一段泛型类或泛型接口声明的类型参数,即不能用在静态成员上
为什么?
因为类或接口上声明的泛型类型是未知类型,需要在对象新建时确定,而则早于对象创建使用,或者不依赖于对象。
4.2 使用总结
IDK1.7支持简写形式:stu1 = new(“张三”,“好”);
指定泛型实参时,左右两边必须一致,不存在多态
笔记:
当类型的元素进行自然排序时,它们是根据字符的编码值排序的
5. 泛型方法 5.1 泛型方法调用
例如:
java.util.array工具类中,有很多通用方法
注意:
情况①