泛型 是一种特殊的类型,我们可以把 泛型 应用在类、接口、方法上,来实现一些通用算法;在确定类型变量这一步中,可以使用 泛型通配符 来限制泛型的范围,来实现一些特殊算法。
上一篇介绍 “ ”,本篇,我们就来 深入泛型的3种使用方式:泛型类、泛型接口、泛型方法 。
泛型学习资料:《泛型最全知识导图》、《大厂泛型面试真题26道》,到本篇结尾处获得~
1 泛型的使用步骤
泛型的主要使用步骤:
1.1 定义类型变量
1.2 使用类型变量
1.3 确定类型变量
PS.
如果对 “ ” 还不是很清楚,可以点击 蓝字 温顾下,结合本篇一起看。
2 泛型的三种使用方式
泛型的三种使用方式:
- 泛型类
- 泛型接口
- 泛型方法
下面,我们用源码实例逐一详解。
2.1 泛型类
2.1.1 泛型类的定义
泛型类, 是在 实例化类时 指明泛型的具体类型,是拥有泛型特性的类,本质还是一个 Java 类,可以被继承。
泛型类是最常见的泛型使用方式,最常见的运用就是各种集合类和接口,例如List、ArrayList 等。
2.1.2 泛型类的格式
格式: public class 类名<数据类型,…> { }
示例: public class Generic <T>{ }
关于数据类型:
- 可以用任意字母来代表,例如 T ,或者 T,E,K,V等形式的参数。
- 也可以用多个英文字母,如果用多个英文字母,需要用逗号隔开,例如 public class Generic<T,K,V>{ } 。
2.1.3 泛型类的使用
- 定义一个类,在该类名后面添加类型参数声明部分,由尖括号分隔;
- 每一个类型参数声明部分,可以包括一个或多个类型参数,参数间用逗号隔开;
- 使用 <T> 来声明一个类型持有者名称,将 T 当作一个类型来声明成员、参数、返回值类型(此处T可以写为任意标识)。
2.1.4 泛型类的示例代码
泛型类:
public class GenericsBox<T> {
private T t;
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
}
泛型类调用:
GenericsBox< integer > integerGenericsBox = new GenericsBox<>();
GenericsBox<String> stringGenericsBox = new GenericsBox<>();
Integer GenericsBox.add(new Integer(25));
String GenericsBox.add(new String("年龄"));
LogUtil.e("泛型类调用", stringGenericsBox.get() + ":" + integerGenericsBox.get());
只要类中操作的引用数据类型不确定,就可以定义泛型类。
通过使用泛型类,可以省去 强制类型转换 的类型转换异常的麻烦。
2.1.5 泛型类的使用注意事项
- 泛型的类型参数(包括自定义类),只能是类类型(String、Integer),不能是简单类型(int,double);
- 不能对确切的泛型类型使用 instanceof 操作,会导致编译时出错。
- 使用泛型时,如果传入泛型实参,会根据传入的泛型实参做相应的限制,此时泛型才会起到本应起到的限制作用;如果不传入泛型类型实参,在泛型类中,使用泛型的方法或成员变量定义的类型,可以是任何的类型。
- 若泛型类型已确定,则只能是其本身,其子类不能使用。
2.2 泛型接口
2.2.1 泛型接口的定义
将泛型用在接口 interface 上,被称为 泛型接口 , 泛型接口 经常被用在各种类的生产器中。
2.2.2 泛型接口的格式
格式:修饰符 interface 接口名 <类型>{ }
示例: public interface ShangHaiJieKou<T> { }
泛型接口格式,类似于泛型类的格式;接口中的方法的格式,类似于泛型方法的格式。
以下有两个类,和一个接口,我们以接口类为例:
1.Genericimpl(接口实现类)
2.Generic_泛型接口<T>(interface接口类)
3.GenericDemo_泛型接口(main方法实现类)
2.2.3 泛型接口的使用
- 定义一个接口,在该接口名后面,添加类型参数声明部分,用尖括号分隔。
- 每一个类型参数声明部分,可以包括一个或多个类型参数,参数间用逗号隔开。
2.2.4 泛型接口的示例代码
public interface GenericsInterface<T> {
public abstract void genericsInterface1(T element);
public abstract <T> void genericsInterface2();
}
2.2.5 泛型接口的使用注意事项
实现泛型的类,必须传入泛型实参,然后在实现类中用该实参来替换 T 。
2.3 泛型方法
2.3.1 泛型方法的定义
泛型方法, 是在 调用方法时 指明泛型的具体类型,既可用在类和接口上,还可用在方法上。
2.3.2 泛型方法的格式
- 格式:修饰符 <类型> 返回值类型方法名(类型变量名){}
- 示例:public <T> void show(T t){}
2.3.3 泛型方法的使用
- 所有泛型方法声明,都有一个类型参数声明部分,由尖括号分隔。该类型参数的声明部分,在方法返回值类型之前;
- 每一个类型参数声明部分,都包括一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符;
- 类型参数可被用来声明返回值类型,作为泛型方法得到的实际参数类型的占位符。
泛型方法的示例代码
打印各种类型的数组中的元素
* @param inputArray
* @param <T>
*/
public static <T> void printLog(T[] inputArray) {
for (T element : inputArray) {
LogUtil.e("打印数组中的元素", element + "");
}
}
创建各种类型的数组(Integer、Double、Character)
Integer[] integerArray = {1, 2, 3, 4, 5};
Double[] doubleArray = {1.1, 2.2, 3.3, 4.4, 5.5};
Character[] characterArray = {'a', 'b', 'c', 'd', 'e'};
printLog(integerArray);
printLog(doubleArray);
printLog(characterArray);
一个 static 的方法,是不能访问泛型类型的参数的。如果 static 方法要使用泛型的能力,就必须使其成为泛型方法。
使用泛型方法,则不受类的限制,不受 static 的限制,可以让方法独立于类而产生变化。
编程原则 :
泛型方法是为了调高代码的重用性和程序安全性,尽量设计泛型方法去解决问题,如果设计泛型方法,可以取代泛型整个类,就选择泛型方法。另外,泛型方法可以搞定的,就不建议使用泛型类了。
3 泛型类的继承
泛型类被继承的情况有两种:子类明确泛型类的类型参数变量、子类不明确泛型类的类型参数变量。
3.1 子类明确泛型类的类型参数变量
把泛型定义在接口上:
public interface Inter<T> {
public abstract void show(T t);
}
定义一个子类来实现接口:
public class InterImpl implements Inter<String> {//子类明确泛型类的类型参数变量为String:
@Override
public void show(String s) {
System.out.println(s);
}
}
测试代码:
public class mingquefanxingcanshu {
public static void main(String[] args) {
Inter<String> i = new InterImpl();
i.show("hello Java !");
}
}
3.2 子类不明确泛型类的类型参数变量
把泛型定义在接口上:
public interface Inter<T> {
public abstract void show(T t);
}
定义一个子类来实现接口:
public class InterImpl<T> implements Inter<T> {//实现类不明确泛型类的类型参数变量,实现类也要定义出<T>类型的
@Override
public void show(T s) {//子类方法也要继承类的数据类型T
System.out.println(s);
}
}
测试代码:
public class mingquefanxingcanshu {
public static void main(String[] args) {
Inter<String> i = new InterImpl();
i.show("hello java!");
}
}
3.3 泛型类的继承注意事项
- 实现类要的是重写父类的方法,返回值的类型需要同父类一样;
- 类上声明的泛形,只对非静态成员有效。
总结
本文主要介绍泛型的3种使用方式,结合“ ” 一起看。
从中,我们了解到了:为什么要使用泛型、什么时候使用泛型,以及泛型的三种使用方式,可以作为泛型的实际应用参考。
知识内化需要实战,建议大家多动手练习,毕竟实践才能出真知。
泛型学习资料:
1 《泛型知识全景导图》高清版本
几乎 囊括了所有泛型核心知识点 ,快速构建泛型知识体系。
2 《大厂泛型面试真题26道》最新最全整理
精选大厂高频 泛型面试题 ,备面、复习时都可以查看 。
如果觉得有帮助,请顺手 点赞 支持下,谢谢。
我是大全哥,持续更新成体系的Java核心技术。 知识成体系 , 学习才高效 ,我们下期见~
— end —