泛型

简介: 泛型


总结于尚硅谷学习视频




GenericTest 类

package com.day0309_2;
import org.junit.jupiter.api.Test;
import java.util.*;
/**
 * 泛型的使用
 * 1.jdk5.0新增的特性
 *
 * 2.在集合中使用泛型:
 * 总结:
 * 1 集合接口或集合类在jdk5.0时都修改为带泛型得到结构。
 * 2 在实例化集合类时可以指明具体的泛型类型
 * 3 指明完以后,在集合类或接口中凡是定义类或接口,内部结构(比如方法、构造器、属性)使用到类的泛型类型的位置,都指定为实例化的泛型类型
 *   比如:add(E e)-->实例化后:add(Integer e)
 * 4 注意点:泛型的类型必须是类,不能是基本数据类型。需要基本数据类型,拿包装类替换
 * 5 如果实例化时,没有指明泛型的类型。默认类型为java.lang.Object类型。
 *
 * 3.如何自定义使用泛型结构:泛型类、泛型接口;泛型方法。见GenericTest1.java
 *
 *
 */
public class GenericTest {
    //在集合中使用泛型之前的情况:
    @Test
    public void test1(){
        ArrayList list=new ArrayList();
        //需求:存放学生成绩
        list.add(78);
        list.add(76);
        list.add(89);
        list.add(88);
        //问题一:类型不安全
//        list.add("Tom");
        for (Object score :
                list) {
            //问题二:强转时,可能出现ClassCastException
            int stuScore = (int) score;
            System.out.println(stuScore);
        }
    }
    //在集合中使用泛型的情况:以ArrayList举例
    @Test
    public void test2(){
        ArrayList<Integer> list=new ArrayList<Integer>();
        //需求:存放学生成绩
        list.add(78);
        list.add(76);
        list.add(89);
        list.add(88);
        //编译时就会进行类型检查,保证数据的安全
//        list.add("Tom");
        //方式一
//        for (Integer score :
//                list) {
//           //避免了强制操作
//            int stuScore = score;
//            System.out.println(stuScore);
//        }
        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()){
            int stuScore = iterator.next();
            System.out.println(stuScore);
        }
    }
    //在集合中使用泛型的情况:以HashMap举例
    @Test
    public void test3(){
//        Map<String,Integer> map=new HashMap<String,Integer>();
        //jdk7新特性:类型推断
        Map<String,Integer> map=new HashMap<>();
        map.put("Tom",87);
        map.put("Jerry",87);
        map.put("Jack",87);
//        map.put(123,"ABC");
        //泛型的嵌套
        Set<Map.Entry<String,Integer>> entry=map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entry.iterator();
        while (iterator.hasNext()){
            Map.Entry<String, Integer> e = iterator.next();
            String key = e.getKey();
            Integer value = e.getValue();
            System.out.println(key+"-->"+value);
        }
    }
}

GenericTest1 类





package com.day0309_2;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.List;
/**
 * 如何自定义使用泛型结构:泛型类、泛型接口;泛型方法。
 *
 *  1.关于自定义泛型类、泛型接口:
 *
 *
 */
public class GenericTest1 {
    @Test
    public void test1(){
        //如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型
        //要求:如果大家定义了类是带泛型的,建议在实例化是要指明类的泛型。
        Order order=new Order();
        order.setOrderT(123);
        order.setOrderT("ABC");
        //建议:实例化时指明泛型类型
        Order <String > order1=new Order<>("orderAA",1001,"AA");
        order1.setOrderT("AA:hello");
    }
    @Test
    public void test2(){
        SubOrder sub1=new SubOrder();
        //由于子类在继承带泛型的父类是,指明了泛型类型,则实例化子类对象时,不再需要指明泛型
        sub1.setOrderT(1122);
        SubOrder1<String> sub2=new SubOrder1<>();
        sub2.setOrderT("order2...");
    }
    @Test
    public void test3(){
        ArrayList<String> list1=null;
        ArrayList<Integer> list2=null;
        //泛型不同的引用不能相互赋值。
//        list1=list2;
        Person p1=null;
        Person p2=null;
        p1=p2;
    }
    //测试泛型方法
    @Test
    public void test4(){
        Order <String> order=new Order<>();
        Integer[] arr=new Integer[]{1,2,3,4};
        //泛型方法在调用时,指明泛型参数的类型。
        List<Integer> list = order.copyFromArrayToList(arr);
        System.out.println(list);
    }
}

Order类

package com.day0309_2;
import java.util.ArrayList;
import java.util.List;
/**
 * 自定义泛型类
 * @param <T>
 */
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 void show(){
        //编译不通过
//        try{
//
//        }catch (T t){
//
//        }
    }
    //泛型方法:在方法中出现了泛型的结构,泛型参数和类的泛型参数没有任何关系。
    //换句话说,泛型方法所属的类是不是泛型类都没有关系。
    //泛型方法:可以声明为静态的。原因:泛型参数是调用泛型方法时确定的,并非在实例化例是调用的
    public static  <E> List<E> copyFromArrayToList(E[] arr){
        ArrayList<E>list=new ArrayList<>();
        for(E e:arr){
            list.add(e);
        }
        return list;
    }
}

Person 类

package com.day0309_2;
public class Person {
}

SubOrder 类

package com.day0309_2;
import java.util.ArrayList;
import java.util.List;
public class SubOrder extends Order<Integer>{//SubOrder:不再是泛型类
    public static  <E> List<E> copyFromArrayToList(E[] arr){
        ArrayList<E>list=new ArrayList<>();
        for(E e:arr){
            list.add(e);
        }
        return list;
    }
}

SubOrder1 类

package com.day0309_2;
public class SubOrder1 <T>extends Order<T> {//SubOrder1<T>:仍然是泛型类
}
相关文章
|
6月前
|
Java
|
6月前
|
安全 算法 Java
深入理解泛型
深入理解泛型
|
存储 安全 Java
泛型的使用
泛型的使用
70 0
|
6月前
|
存储 算法 容器
什么是泛型?
什么是泛型?
26 0
|
6月前
什么是泛型,泛型的具体使用?
什么是泛型,泛型的具体使用?
35 0
|
6月前
|
Java
什么是泛型, 泛型的具体使用
什么是泛型, 泛型的具体使用
34 0
|
6月前
|
存储 Java
什么是泛型, 泛型的具体使用?
什么是泛型, 泛型的具体使用?
|
编译器 C#
C# 泛型
C# 泛型
61 0
|
存储 C#
【C#】什么是泛型?
泛型是C#编程中一个非常重要的概念,它能够编写更加通用、灵活和可重用的代码,能够编写可以在不同类型之间工作的代码,同时还可以提高代码的效率和可维护性。在本文中,我们将探讨泛型及其在C#编程中的应用。
|
存储 Java 编译器
对泛型的认识
对泛型的认识