12.泛型

12.泛型,第1张

1.泛型的概念

所谓泛型,就是在允许在定义类、接口时通过一个标识表示某个属性的类型或某个方法的返回值及参数类型,这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时确定(即传入实际的类型参数,也称为类型实参))

2.在集合中使用泛型 1.在集合中没有用到泛型前
@Test
public void Test1(){
    ArrayList list=new ArrayList();
    //需求:存放学生的成绩
    list.add(78);
    list.add(76);
    list.add(89);
    list.add(88);
    //1.类型不安全
    list.add("Tom");

    for (Object score : list) {
        //2.强转时,可能出现ClassCastException
        int stuScore= (int) score;
        System.out.println(stuScore);
    }

}
2.在集合中用到泛型
 //以HashMap为例
    @Test
    public void Test3(){
//        Map map=new HashMap();
        Map<String,Integer> map=new HashMap<>();
        map.put("Tom",87);
        map.put("Jerry",87);
        map.put("Jack",67);

        Set<Map.Entry<String, Integer>> entry = map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entry.iterator();
        while(iterator.hasNext()){
            Map.Entry<String, Integer> entry1 = iterator.next();
            String key = entry1.getKey();
            Integer value = entry1.getValue();
            System.out.println(key+"  "+value);
        }
    }
    //在集合中使用泛型的情况
    @Test
    public void Test2(){
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(78);
        list.add(87);
        list.add(99);
        list.add(65);
//        list.add("Tom");
//        for (Integer score :
//                list) {
//            //避免强转 *** 作
//            int stuScore = score;
//            System.out.println(stuScore);
//        }
        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()){
            Integer stuScore = iterator.next();
            System.out.println(stuScore);
        }
    }
3.集合中使用泛型的总结

总结:①集合接口或集合类在jdk5.0时都修改为带泛型的结构
②在实例化集合类时,可以指明具体的泛型类型
③指明完以后,在集合类或接口中凡是定义类或接口时,内部结构使用到类的泛型的位置,都指定为实例化时泛型类型,比如add(E e)
④注意:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类替换
⑤如果实例化时,没有指明泛型的类型,默认类型为java.lang.Object类型

3.自定义泛型类、接口方法
public class Order<T>{
    String orderName;
    int orderId;

    //类的内容结构就可以使用类的泛型
    T orderT;

    public Order() {
        //编译不通过
//        T[] arr=new T[10];
        T[] arr=(T[]) new Object[10];

    }

    public Order(String orderName, int orderId, T orderT) {
        this.orderName = orderName;
        this.orderId = orderId;
        this.orderT = orderT;
    }

    //如下的三个方法都不是泛型方法
    public T getOrderT() {
        return orderT;
    }

    public void setOrderT(T orderT) {
        this.orderT = orderT;
    }

    @Override
    public String toString() {
        return "Order{" +
                "orderName='" + orderName + '\'' +
                ", orderId=" + orderId +
                ", orderT=" + orderT +
                '}';
    }
    //静态方法中不能使用类的泛型
//    public static void show(T orderT){
//        System.out.println(orderT);
//    }

    //泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系
    //泛型方法:可以声明为静态的,原因:泛型参数是在调用方法时确定的,并非在实例化的时候确定的
    public static <E> List<E> copyFromArrayToList(E[] arr){
        ArrayList<E> list = new ArrayList<>();
        for (E e :
                arr) {
            list.add(e);
        }
        return list;
    }
}
public class SubOrder extends Order<Integer>{
    //SubOrder不是泛型类
}
SubOrder<Integer> o=new SubOrder<>();
public class SubOrder<T> extends Order<T>{
    //SubOrder是泛型类
}

测试:

@Test
public void Test1(){
    //如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型
    Order order = new Order();
    order.setOrderT(123);
    order.setOrderT("ABC");

    Order<String> order1=new Order<String>("orderAA",1001,"order:orderAA");
    order.setOrderT("AA:hello");

}
@Test
public void Test2(){
    SubOrder sub1=new SubOrder();
    //由于子类在继承带泛型的父类时,指明了泛型类型,则实例化子类对象时,不需要指明泛型
    sub1.setOrderT(1212);
}
//测试泛型方法
@Test
public void Test3(){
    Order<String> order=new Order<>();
    Integer[] arr = new Integer[]{1, 2, 3, 4};
    //泛型方法在调用时,指明泛型参数的类型
    List<Integer> list=order.copyFromArrayToList(arr);
    System.out.println(list);
}

DAO定义了 *** 作数据库中的表的通用 *** 作。 ORM思想(数据库中的表和Java中的类对应)

public class DAO {
    //添加一条记录

    //删除一条记录

    //修改一天记录

    //查询一条记录

    //查询多条记录
}
4.泛型在继承上的体现
/*
    1.泛型在继承方面的体现
    类A是类B的父类,G和G二者不具备子父类关系,二者是并列关系
    补充:A是B的父类
    * */
    @Test
    public void Test1(){
        Object obj=null;
        String str=null;
        obj=str;

        Object[] arr1=null;
        String[] arr2=null;
        arr1=arr2;

        List<Object> list1=null;
        List<String> list2=null;
        //此时list1和list2的类型不具有子父类关系
//        list1=list2;

//        Date date=new Date();
//        str=date;

    }
5.通配符的使用
 /*
    2.通配符的使用
    通配符:?
    类A是类B的父类,G和G是没有关系的,二者共同的弗雷什G

    * */
    @Test
    public void Test2(){
        List<Object> list1=null;
        List<String> list2=null;

        List<?> list=null;
        //对于list就不能向其内部添加数据(null除外),
        list=list1;
        list=list2;
    }

    public void print(List<?> list){
        Iterator<?> iterator = list.iterator();
        while(iterator.hasNext()){
            //读取的数据类型为Object
            Object next = iterator.next();
            System.out.println(next);
        }
    }
    /*
    3.有限制条件的通配符的使用
    	? extends Person
    	? super Person
    * */
    @Test
    public void test(){
        List<? extends Person> list1=null;
        List<? super Person> list2=null;

        List<Student> list3=null;
        List<Person> list4=null;
        List<Object> list5=null;


        list1=list3;
        list1=list4;
//        list1=list5;

    }

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/3002771.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)

保存