zoukankan      html  css  js  c++  java
  • Generic 泛型 <> 钻石表达式

    什么是泛型:
        1 JDK5.0之后推出的新特性:泛型
        2 泛型这种语法机制,只在程序编译阶段起作用,只是给编译器作参考的。(运行阶段泛型没用!)
        3 使用了泛型的好处是什么?
            第一:集合中存储的元素类型统一了。
            第二:从集合中取出的元素类型是泛型指定的类型,不需要进行大量的“向下转型”!
     
     
        4 泛型的缺点是什么?
            导致集合中存储的元素缺乏多样性!
            大多数业务中,集合中的元素类型还是统一的,所以这种泛型特性被大家所认可。
     
     
    案例1:
    package com.javaSe;
    
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    
    /*
    1 JDK5.0之后推出的新特性:泛型
    2 泛型这种语法机制,只在程序编译阶段起作用,只是给编译器作参考的。(运行阶段泛型没用!)
    3 使用了泛型的好处是什么?
        第一:集合中存储的元素类型统一了。
        第二:从集合中取出的元素类型是泛型指定的类型,不需要进行大量的“向下转型”!
    
    
    4 泛型的缺点是什么?
        导致集合中存储的元素缺乏多样性!
        大多数业务中,集合中的元素类型还是统一的,所以这种泛型特性被大家所认可。
    */
    public class GenericTest01 {
        public static void main(String[] args) {
            /*// 不使用泛型机制,分析程序存在的缺点
            List myList = new ArrayList();
            
            // 准备对象
            Cat c = new Cat();
            Bird b = new Bird();
            
            // 将对象添加到集合当中
            myList.add(c);
            myList.add(b);
            
            // 遍历集合,取出Cat让他抓老鼠,取出Bird让它飞。
            Iterator it = myList.iterator();
            while(it.hasNext()){
                
                *//*if (obj instanceof Cat){
                    ((Cat) obj).catchMouse();
                }else if(obj instanceof Bird){
                    ((Bird) obj).fiy();
                }*//*
                
                // 没有这个语法,通过迭代器取出就是Object
                // Animal a = it.next();
                
                // obj中没有move方法,无法调用,需要向下转型!
                Object obj = it.next();
                
                if(obj instanceof Animal){
                    Animal a = (Animal)obj;
                    a.move();
                }
            }*/
            
            // 使用JDK5之后的泛型机制
            // 使用泛型List<Animal>之后,表示List集合中只允许存储Animal类型的数据。
            // 用泛型来指定集合中存储的数据类型
            List<Animal> list = new ArrayList<Animal>();
            
            // 指定List集合中只能存储Animal类型的对象,那么存储String类型就报错了。
            // 这样用了泛型之后,集合中的元素数据类型更加统一了。
            // list.add("abc");
        
            // 准备对象
            Cat c = new Cat();
            Bird b = new Bird();
        
            // 将对象添加到集合当中
            list.add(c);
            list.add(b);
            
            // 获取迭代器
            Iterator<Animal> it = list.iterator();
            while(it.hasNext()){
                
                // 使用泛型之后,每一次迭代返回的数据都是Animal类型。
                /*Animal a = it.next();
                a.move();*/
        
                Animal a = it.next();
                if(a instanceof Cat){
                    ((Cat) a).catchMouse();
                }
                
                if(a instanceof Bird){
                    ((Bird) a).fiy();
                }
            }
            
        }
    }
    
    
    class Animal{
        public void move(){
            System.out.println("动物在移动!");
        }
    }
    
    
    class Cat extends Animal{
        public void catchMouse(){
            System.out.println("猫抓老鼠!");
        }
    }
    
    
    class Bird extends Animal{
        public void fiy(){
            System.out.println("鸟儿在飞翔!");
        }
    }

    案例2:

    package com.javaSe;
    
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    
    /*
    JDK之后引入了:自动类型推断机制。(又称为钻石表达式)
    */
    public class GenericTest02 {
        public static void main(String[] args) {
            // ArrayList<这里的类型会自动推断>(),前提是JDK8之后才允许。
            // 自动类型推断,钻石表达式!
            List<Animal> myList = new ArrayList<>();
            myList.add(new Animal());
            myList.add(new Cat());
            myList.add(new Bird());
            
            // 遍历
            Iterator<Animal> it = myList.iterator();
            while(it.hasNext()){
                Animal animal = it.next();
                animal.move();
            }
            
            List<String> strList = new ArrayList<>();
            // 类型不匹配
            // strList.add(new Cat());
            strList.add("http://www.baidu.com");
            strList.add("http://www.126.com");
            strList.add("http://localhost:8090/reinsure");
            
            // 类型不匹配
            // strList.add(123);
        
            System.out.println(strList.size());
            
            // Iterator的泛型就是String
            Iterator<String> iterator = strList.iterator();
            /*Object obj = iterator.next();
                if(obj instanceof String){
                    String s = ((String) obj).substring(7);
                    System.out.println(s);
                }*/
            while (iterator.hasNext()){
                
                // 如果没有使用泛型
                
                
                // 通过迭代器获取了String类型的数据
                String s = iterator.next();
                // 直接调用String类的subString()方法截取字符串。
                s = s.substring(7);
                System.out.println(s);
            }
        }
    }

    案例3:

    package com.javaSe;
    /*
    自定义泛型可以吗?可以
        自定义泛型的时候,<>尖括号中的是一个标识符,随便写。
        java源代码中经常出现的是:
            <E>和<T>
        E是element单词首字母。
        T是type单子首字母。
        
    */
    public class GenericTest03<aaaaaa> {
        public void doSome(aaaaaa o) {
            System.out.println(o);
        }
        
        public static void main(String[] args) {
            // new对象的时候指定了泛型是:String类型
            GenericTest03<String> gt = new GenericTest03<>();
            
            // 类型不匹配
            // gt.doSome(123)
            
            gt.doSome("abcdef");
            
            // ------------------------------------------------------
            
            GenericTest03<Integer> gt2 = new GenericTest03<>();
            gt2.doSome(123);
            
            // 类型不匹配
            // gt2.doSome("123");
            
            MyIterator<String> mit = new MyIterator();
            String s1 = mit.get();
            System.out.println(s1);
        
            MyIterator<Animal> mit2 = new MyIterator();
            Animal a = mit2.get();
            System.out.println(a);
            
            // 不用泛型就是Object类型
            // GenericTest03 gt3 = new GenericTest03();
            // gt3.doSome(new Object());
        }
    }
    
    
    class MyIterator<T>{
        public T get(){
            return null;
        }
    }
  • 相关阅读:
    20182311 2019-2020-1 《数据结构与面向对象程序设计》实验一报告
    20182311 2019-2020-1 《数据结构与面向对象程序设计》第1周学习总结
    20182320 2019-2020-1 《数据结构与面向对象程序设计》第2-3周学习总结
    20182320 2019-2020-1 《数据结构与面向对象程序设计》实验1报告
    预备作业
    mysql-sysbench编译安装过程问题
    mysql报错-ERROR 2002
    oracle中的root权限问题
    linux物理内存和虚拟内存
    shell-linux普通用户自动登录root脚本
  • 原文地址:https://www.cnblogs.com/xlwu/p/13415713.html
Copyright © 2011-2022 走看看