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;
    }
}
原文地址:https://www.cnblogs.com/xlwu/p/13415713.html