[Java]深入理解泛型工作机制与拓展应用

泛型:这个概念是在JDK5中引入的特性
作用:在编译阶段约束操作的数据类型并且进行检查
泛型的格式<数据类型>
注意:泛型只能支持引用数据类型
————————————————————————————————————————
引入一个问题?那么在JDK5之前,没有泛型存在,那么我们怎么处理问题呢?
结论:如果不添加泛型。我们可以在集合中添加任意的数据类型
带来一个坏处:我们在调用数据的时候 无法使用其特有的行为

Java为了解决这个问题 就创建了泛型这种特性
好处:
1.可以统一数据类型,提高操作的便利性
2.把运行时期遇到的问题提前到了编译期,避免了强制类型转换可能出现的异常 因为在编译阶段就可以把数据的类型确定下来

——————————————————————————

我们来深入的讲解泛型:
Java中的泛型实际是一种伪泛型,这种泛型只在编译中有效
具体的来说:
假设我现在编写了一条 Collection arr = ArrayList<>();
很明显,现在的泛型是String 也就是限定只有String类型的字符串可以被
添加到我的Arraylist类型的集合arr中
但是实际上这种检查是很表象的,因为Java只会在你输入这个集合的时候检查你是不是String类型
但是当你的元素被添加到Arraylist里面去后 还是会把你当做object来对待 只有在输出结果的时候加上String类型的tag
譬如我们在把Java文件编译为字节码文件的时候 泛型就会消除
这个过程我们叫做“泛型的擦除”
在JDK5之前已经有很多没有泛型的代码在运行了 我们只能在这个“shit hill”上修修补补
很明显 泛型就是在门口加上了一个判定机制而已

————————————————————

泛型的细节:
1.泛型中不能写基本数据类型(因为基本数据类型无法被转成object类型)
2.在指定泛型的具体类型后 传递数据可以传入该类型或者其子类的类型
(譬如原先没有泛型的时候 其实可以看作泛型是object 现在有泛型了)
(要做的无非是将可以被塞入的数据进行一个范围的缩小)
(但是范围再缩小 就像Object被缩小到了Animal 那Animal的子类 Cat和Dog也是一样可以传入的)
3.如果不写泛型 那么类型默认就是Object

——————————————————————————————————

泛型明显不仅可以放在创建对象上
泛型也可以放在类:
public class ArrayList{} 无非是在类名后加入一个而已
表示这个类型是不确定的 创建Arraylist对象的时候 这个就会被替换为实际的类型
这里的可以被理解 记录数据类型而非是数据
泛型可以被放在方法中:
例如:
publicvoid show(T t){}
import java.util.ArrayList;
import java.util.Iterator;

public class Main {
    public static void main(String[] args) {
        /*
        泛型:这个概念是在JDK5中引入的特性
        作用:在编译阶段约束操作的数据类型并且进行检查
        泛型的格式<数据类型>
        注意:泛型只能支持引用数据类型
        ————————————————————————————————————————
        引入一个问题?那么在JDK5之前,没有泛型存在,那么我们怎么处理问题呢?
        结论:如果不添加泛型。我们可以在集合中添加任意的数据类型
        带来一个坏处:我们在调用数据的时候 无法使用其特有的行为

        Java为了解决这个问题 就创建了泛型这种特性
        好处:
        1.可以统一数据类型,提高操作的便利性
        2.把运行时期遇到的问题提前到了编译期,避免了强制类型转换可能出现的异常 因为在编译阶段就可以把数据的类型确定下来

        */

        //1.创建一个集合的对象
        ArrayList list = new ArrayList();

        //2.添加数据
        list.add(123);
        list.add("aaa");
        list.add(new Student("zhangsan", 123));
        //但是这样 你会发现无法遍历啊
        Iterator it = list.iterator();
        while (it.hasNext()) {
            //多态的弊端是不能访问子类的特有功能的
            //obj已经是最高级的父类了
            //它不可以使用子类的方法
            //所以我们希望将集合限定在某一个特殊的泛型上
            //支持这个原因的另外一个证据是 我们很难在实际开发中对每一个元素都进行特定的强转

            Object obj = it.next();
            System.out.println(obj);
        }

         /*
         我们来深入的讲解泛型:
         Java中的泛型实际是一种伪泛型,这种泛型只在编译中有效
         具体的来说:
         假设我现在编写了一条 Collection arr = ArrayList<>();
         很明显,现在的泛型是String 也就是限定只有String类型的字符串可以被
         添加到我的Arraylist类型的集合arr中
         但是实际上这种检查是很表象的,因为Java只会在你输入这个集合的时候检查你是不是String类型
         但是当你的元素被添加到Arraylist里面去后 还是会把你当做object来对待 只有在输出结果的时候加上String类型的tag
         譬如我们在把Java文件编译为字节码文件的时候 泛型就会消除
         这个过程我们叫做“泛型的擦除”
         在JDK5之前已经有很多没有泛型的代码在运行了 我们只能在这个“shit hill”上修修补补
         很明显 泛型就是在门口加上了一个判定机制而已

          */
        /*
        泛型的细节:
        1.泛型中不能写基本数据类型(因为基本数据类型无法被转成object类型)
        2.在指定泛型的具体类型后 传递数据可以传入该类型或者其子类的类型
        (譬如原先没有泛型的时候 其实可以看作泛型是object 现在有泛型了)
        (要做的无非是将可以被塞入的数据进行一个范围的缩小)
        (但是范围再缩小 就像Object被缩小到了Animal 那Animal的子类 Cat和Dog也是一样可以传入的)
        3.如果不写泛型 那么类型默认就是Object
         */

        /*
        泛型明显不仅可以放在创建对象上
        泛型也可以放在类:
        public class ArrayList{} 无非是在类名后加入一个而已
        表示这个类型是不确定的 创建Arraylist对象的时候 这个就会被替换为实际的类型
        这里的可以被理解 记录数据类型而非是数据
        泛型可以被放在方法中:
        例如:
        publicvoid show(T t){}
         */
    }
}

你可能感兴趣的:(java,开发语言)