泛型

 在集合中使用泛型:

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<?>

 

 

 

posted @ 2022-08-28 11:12  Mr_sven  阅读(2)  评论(0编辑  收藏  举报