" 的形式呈现,"<>" 中写引用数据类...">

泛型

作者: Finlay_Li | 来源:发表于2019-04-07 16:44 被阅读0次

    泛型Generic(JDK1.5新加入):

    1、在 Java 中以 "<>" 的形式呈现,"<>" 中写引用数据类型

    2、泛型中的类型可用任意字母代表
    通常我们使用 T : Type E : Element K : Key V : Value R : Return

    为什么使用泛型:

    1、我们在操作数据时,有时不知道要操作的数据是什么类型。
    提高代码复用性
    2、集合中不使用泛型,意味着集合中可以存储任意类型的对象
    若需要具体到某一个数据类型时,需要强制类型转换,可能引发 ClassCastException
    解决元素存储的安全性, 解决获取元素时,需要类型强转的问题(繁琐)

    泛型本质

    只作编译时限制,当执行时不作读取。
    证:通过查看.class文件,<>是不存在的

    泛型相关使用

    集合中

    1、List
    List<String> list=new ArrayList<>();
    ①add() 只能添加String
    ②泛型提供编译检查


    2、迭代器使用泛型
    Iterator<Integer> it=set.iterator();
    当遍历时,迭代器使用泛型或者Map遍历使用泛型,等于取出的类型也限制


    3、Map
    Set<Entry<Person,Integer>> set=map.entrySet();
    Iterator<Entry<Person,Integer>> it=set.iterator();
    while(it.hasNext()){
    Entry<Person,Integer> ety=it.next();
    Person p=ety.getKey();
    Integer ity=ety.getValue();
    System.out.println(p+"=="+ity);
    }

    DAO层

    1、场景
    数据库表,属性<——>类,属性
    成千上万张表——>成千上万个类处理
    处理方法——>成千上万的方法

    2、我们想要的方法是:当千万张表使用同一个功能方法时,我们只写一个这样的方法即可

    3、这时,设计带泛型的DAO类,适用于任意不同类型的类

    
        public class DAO<T> {//Database Access Object
            
            private List<T> list = new ArrayList<>();
            
            public void add(T t){
                list.add(t);
            }
            
            public T get(int id){
                return list.get(id);
            }
            
            public void update(int id, T t){
                list.set(id, t);
            }
        }
    
        //对任意不同类型的类进行操作
        public void test5(){
            DAO<Person> dao = new DAO<>();
            dao.add(new Person("张三", 18));
            Person p = dao.get(0);
            System.out.println(p);
            
            DAO<Order> orderDAO = new DAO<>();
            orderDAO.add(new Order());
            Order o = orderDAO.get(0);
            System.out.println(o);
        }
    

    自定义泛型类、接口

    1、何时定义:
    当我们在写时不确定以后要用的是什么类型,但知道肯定要有这个元素

    2、何时确定? 使用时确定

    3、示例

        public class MyGeneric <T>{
        private T tt;//未知类型
        
        public void add(T tt){ //不确定类型
            
        }
        
        public T get(){ //不确定类型
            return null;
        }
    
         @Test
        public void test4(){
            //使用时,类型随着类类型的确定而确定,有了编译检查,其他类型不可传递
            MyGeneric<String> mg = new MyGeneric<>();
            mg.add("BBB"); 
            String str=mg.get();
            
            MyGeneric<Person> mg1 = new MyGeneric<>();//使用该类
            mg1.add(new Person());
            Person p=mg1.get();
        }
    

    自定义泛型方法

    1、何时定义:
    当写方法时,返回值不确定
    同时,返回值的类型与类的<T>又不一样

    2、如何定义:在方法中声明<>

    3、方法在什么时候可以确定类型?(参数列表)
    调用方法,传入一个实参时,返回值的类型以实参的类型为准

    4、示例

        public <E> E sort(List<E> list){
                //sort(new ArrayList<String>());
            return list.get(0);
        }
    

    通配符 ( ? )

    1、为何使用?
    虽然 Man 是 Person 的子类,但是泛型限制后 List<Man> 就不能给List<Person> 。
    意味着不能使用多态

    2、统配符的三种使用
    List<?> :
    1 可以接收任意泛型类型的集合
    2 但是在集合的使用中,遍历时又的按Object取!要强转!又倒回去了!

    List<? extends Person> :
    1 只可以接收 Person 本类类型的泛型集合及 Person 子类类型的泛型集合,再次限制类型为Person
    2 我们又可以使用多态了
    3 若要调用子类特有方法,当然还得 instanceof

    List<? super Person> :
    1 只可以接收 Person 本类类型的泛型集合集 Person 父类类型的泛型集合
    2 向上限制,没啥用

    相关文章

      网友评论

          本文标题:泛型

          本文链接:https://www.haomeiwen.com/subject/gppsiqtx.html