Java泛型(泛型类、泛型方法、泛型接口)
泛型引入
如果我们需要产生多个对象,每个对象的逻辑完全一样,只是对象内的成员变量的类型不同,那我们如何去做? 此时,我们就引入了泛型。
泛型:让数据类型变得参数化。定义泛型时,对应的数据类型是不确定的。泛型方法被调用时,才指定具体类型 这样就解决了多个相似的类(方法、接口 )创建的问题,一个泛型类即可代替所有相关类(方法、接口),提高代码的重用性
1. 泛型类特点
-
泛型的类型参数可以是泛型类 泛型类可是同时设置多个类型参数 泛型类可以继承泛型类 泛型类可以实现泛型接口
2. 最简单泛型类
泛型类: 调用泛型类时才指定具体类型:
3. 泛型方法
3.1 定义泛型方法
-
定义格式:
访问修饰符 <泛型列表> 返回类型 方法名(参数列表) { 实现代码; }
-
在泛型列表中声明的泛型,可用于该方法的返回类型声明、参数类型声明和方法代码中的局部变量的类型声明 类中的其他方法不能使用当前方法声明的泛型
注意: 是否拥有泛型方法,与其所在的类是否是泛型没有关系,要定义泛型方法,只需将泛型参数列表置于返回值前
示例:
package com.demo; class Parent { //泛型方法 public <T> void printInfo(T a) { System.out.println(a); } //重载泛型方法 public <T, T2> T2 printInfo(T a, T2 b) { System.out.println(a); System.out.println(b); return b; } } public class Test { public static void main(String[] args) { Parent one = new Parent(); one.printInfo("hello"); one.printInfo("hello", 10); } }
结果:
3.2 使用extends关键字限制泛型类型
格式:
访问修饰符 <泛型 extends A> 返回类型 方法名(参数列表) { 实现代码; }
此时泛型的类型就只能是 A 类或者 A 的子类
示例:
package com.demo; class Parent { void print() { System.out.println("上限为父类"); }; } class Child extends Parent { //重写方法 void print() { System.out.println("下限为子类"); } } class User{ //泛型方法 public <T extends Parent> void printInfo(T t) { t.print(); } } public class Test { public static void main(String[] args) { User one = new User(); one.printInfo(new Child()); one.printInfo(new Parent()); } }
结果:
3.3 静态泛型方法
使用static进行修饰
示例:
package com.demo; class Parent { void print() { System.out.println("上限为父类"); }; } class Child extends Parent { //重写方法 void print() { System.out.println("下限为子类"); } } class User{ //静态泛型方法 public static <T extends Parent> void printInfo(T t) { t.print(); } } public class Test { public static void main(String[] args) { User one = new User(); //静态泛型方法通过实例化对象去动态调用会出现警告 one.printInfo(new Child()); one.printInfo(new Parent()); //静态调用则不会出现警告 User.printInfo(new Child()); } }
结果:
4. 泛型接口
5. 泛型类可是同时设置多个类型参数
6. 泛型的类型参数可以是泛型类
注意:第一个getMessage() 获取的是泛型类,第一个获取的是 getMessage() 获取的才是整数a的值
7. 泛型类可以继承泛型类
8. 泛型类可以实现泛型接口
上一篇:
IDEA上Java项目控制台中文乱码