泛型
![](https://img2022.cnblogs.com/blog/2111933/202208/2111933-20220828111148223-415343393.png)
在集合中使用泛型:
1.集合接口或集合类在jsdk5.0时都修改为带泛型的结构。
2.在实例化集合类时,可以指明具体的泛型类型。
3.指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(方法,构造器,属性等)使用到类的泛型的位置,都指定为实例化的泛型类型,
比如:add(E e),实例化以后,add(Integer e)。
4.泛型的类型必须是类,不能是基本数据类型,需要用到基本数据类型时,使用包装类。
5.如果实例化时没有指明泛型的类型,默认类型为Object类型
自定义泛型结构
一、泛型类,泛型接口:
public class Order<T> { String name; int id; //类的内部结构可以使用类的泛型 T orderT; public Order() { } public Order(String name, int id, T orderT) { this.name = name; this.id = id; this.orderT = orderT; } public T getOrderT() { return orderT; } public void setOrderT(T orderT) { this.orderT = orderT; } }
没有使用泛型
public class GenericTest { @Test public void test(){ //如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型 Order order = new Order(); order.setOrderT(213); order.setOrderT("abc"); } }
使用泛型
@Test public void test(){ Order<String> order = new Order<>("a",123,"bbb"); order.setOrderT("111"); order.setOrderT("abc"); }
public class SubOrder extends Order<Integer> {//不是泛型类 } @Test public void test1(){ //由于子类在继承带泛型的父类时,指明了泛型的类型,则实例化子类对象时,不再需要指明泛型 SubOrder subOrder = new SubOrder(); subOrder.setOrderT(1); }
注意:
1.类中的静态方法中,不能使用类的泛型
2.异常类不能声明为泛型类
3.不能声明:T[] arr = new T[10]; 可以这样声明:T[] arr = (T[]) new T[10];
二、泛型方法:
public class SubOrder<Integer> extends Order<Integer> { //泛型方法 public <E>List<E> copyFromArrayToList(E[] arr){ List<E> list = new ArrayList<>(); for(E e : arr){ list.add(e); } return list; } }
public class SubOrder<T> extends Order<Integer> { //泛型方法 //可以声明为静态的,泛型参数是在调用方法时确定的,并非在实例化时确定的 public <E>List<E> copyFromArrayToList(E[] arr){ List<E> list = new ArrayList<>(); for(E e : arr){ list.add(e); } return list; } } @Test public void test2(){ SubOrder<String> subOrder = new SubOrder<>(); Integer[] nums = new Integer[]{1,2,3,4,5}; //泛型方法在调用时,指明泛型参数的类型 List<Integer> list = subOrder.copyFromArrayToList(nums); }
通配符:?
类A是B的父类,G<A>和G<B>是没有关系的,二者共同的父类是G<?>