泛型是一种数据类型,当我们不知道使用什么数据类型是,可以使用泛型。 泛型也可以看出一个变量,用来接收数据类型。
E e :Element 元素
?
T t :Type 类型
如:
ArrayList集合在定义的时候,不知道集合都会存储什么类型的数据,所以使用泛型:
E :未知的数据类型
答:创建集合对象的时候,就会确定泛型的数据类型
ArrayList<String> list = new Arraylist<>(); public class ArrayList<E>{ public boolean add(E e){} public E get(int index){} }
//创建集合对象的时候,就会确定泛型的数据类型
public class Arraylist<String>{ public boolean add(String s){} public String get(int index){} } ?
我们在集合中会大量使用到泛型,这里来完整地学习泛型知识。
泛型,用来灵活地将数据类型应用到不同的类、方法、接口当中。
将数据类型作为参数进行传递。
定义语法格式:
修饰符 class 类名<代表泛型的变量> { //方法体 }
例如,API中的ArrayList集合:
class ArrayList<E>{ public boolean add(E e){ } ? public E get(int index){ } .... }
例如,
ArrayList<String> list = new ArrayList<String>();
此时,变量E的值就是String类型,那么我们的类型就可以理解为:
class ArrayList<String>{ public boolean add(String e){ } ? public String get(int index){ } ... }
当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
此时只能接受数据,不能往该集合中存储数据。
之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛型的上限和下限。
泛型的上限:
格式: 类型名称 <? extends 类 > 对象名称
意义: 只能接收该类型及其子类
泛型的下限:
格式: 类型名称 <? super 类 > 对象名称
意义: 只能接收该类型及其父类型
比如:现已知Object类,String 类,Number类,Integer类,其中Number是Integer的父类
public class DemoGeneric { public static void main(String[] args) { Collection<Integer> list1 = new ArrayList<Integer>(); Collection<String> list2 = new ArrayList<String>(); Collection<Number> list3 = new ArrayList<Number>(); Collection<Object> list4 = new ArrayList<Object>(); ? getElement1(list1); // getElement1(list2);//报错 String类与Number类没有继承关系,因此泛型没有受限一说 getElement1(list3); // getElement1(list4);//报错 Object类是Number类的父类,因此不能使用泛型上限 ? // getElement2(list1);//报错 // getElement2(list2);//报错 getElement2(list3); getElement2(list4); ? /* 类与类之间的继承关系: Integer extends Number extends Object String extends Object */ ? } ? // 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类 public static void getElement1(Collection<? extends Number> coll) { } ? // 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类 public static void getElement2(Collection<? super Number> coll) { } }
定义语法格式:
权限修饰符 class 类名<泛型>{}
权限修饰符 返回值类型 方法名(泛型作为参数传递){}
定义语法格式:
接口:权限修饰符 interface 接口名称<泛型>{}
实现类: 权限修饰符 class 类名<泛型> implement 接口名<泛型>{}
权限修饰符 返回值类型 方法名(泛型作为参数传递){}
package _4泛型的概念和使用._4泛型的高级使用$泛型的受限$上限_下限; ? import java.util.ArrayList; import java.util.Collection; ? /** * @Author Admin * @Classname DemoGeneric * @Package _4泛型的概念和使用._4泛型的高级使用$泛型的受限$上限_下限 * @GreatDate 2020/04/17 21:56:07 * @Description TODO 泛型的高级使用,泛型的受限(上、下限限定) */ /* 泛型的受限 上限限定:? extends E;代表使用的泛型只能是E类型的子类/本身 下限限定:? super E: 代表使用的泛型只能是E类型的父类/本身 */ public class DemoGeneric { public static void main(String[] args) { Collection<Integer> list1 = new ArrayList<Integer>(); Collection<String> list2 = new ArrayList<String>(); Collection<Number> list3 = new ArrayList<Number>(); Collection<Object> list4 = new ArrayList<Object>(); getElement1(list1); //getElement1(list2);//报错 getElement1(list3); //getElement1(list4);//报错 //getElement2(list1);//报错 //getElement2(list2);//报错 getElement2(list3); getElement2(list4); } /* 类生类之间的继承关系 Integer extends Number extends Object String extends 0bject */ // 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类 public static void getElement1(Collection<? extends Number> coll){} // 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类 public static void getElement2(Collection<? super Number> coll){} } ?
原文:https://www.cnblogs.com/elvin-j-x/p/12722808.html