千家信息网

Java泛型的原理分析是怎样的

发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,这篇文章将为大家详细讲解有关Java泛型的原理分析是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、前言泛型在java中有很重要的地位,在实际
千家信息网最后更新 2025年01月22日Java泛型的原理分析是怎样的

这篇文章将为大家详细讲解有关Java泛型的原理分析是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

    一、前言

    泛型在java中有很重要的地位,在实际开发中用处也很大。

    二、泛型

    泛型:是jdk5中引入的特性,他提供编译是类型是类型的安全检测机制,这个机制允许在编译时检测到非法的类型,它的本质是参数化类型,也就是所操作的数据类型不变指定为一个参数

    将原来具体的类型参数化,然后再使用/调用的时候传入具体的参数

    泛型的类型:

    ①:泛型类

    ②:泛型方法

    ③:泛型接口

    三、泛型定义的格式:

    <类型> :指定一种类型的格式,这里的类型可以看成是形参。

    <类型1,类型2...>:指定多种类型的格式,多种类型之间用逗号隔开,这里的类型类型1,类型2可以看成是形参,将来具体调用的时候的参数看成是实参,这里的泛型只能是引用类型

    什么是引用类型?

    除了八大基本类型其他的都是引用类型,如基本类型对应的包装类

    • boolean -->Boolean

    • char --->Character

    • byte -->Byte

    • short -->Short

    • int -->Integer

    • long -->Long

    • float -->Float

    • double -->Double

    泛型的好处是:

    • 把运行得问题提前到编译时期

    • 避免了强制转换

    没指定类型默认是Object类型

    举个例子,当没有使用泛型时:

    import java.util.HashMap;import java.util.Map;import java.util.Set; public class 泛型Demo {    public static void main(String[] args) {        //创建一个对象        Map map=new HashMap();        //添加数据        map.put(1, "张三");        map.put(2, "李四");        map.put(3,"王五");        map.put(5, 6);//加了不一样的类型数据         //键的集合        Set keySet=map.keySet();        //键找值        for(Object key: keySet){            String value=(String)map.get(key);            System.out.println(key+":"+value);        }      }}

    报了一个类型转换异常(int会自动转化成Integer),Integer不能转为String

    Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

    此时泛型的好处就体现出来了,将运行时会出现的错误拉到了编译期间。

    当然也可以在输出是采用Object接收

            //键的集合        Set keySet=map.keySet();        //键找值        for(Object key: keySet){           Object value=map.get(key);          //  String value=(String)map.get(key);            System.out.println(key+":"+value);        }

    这样也可以得到想要的结果。

    四、泛型类

    泛型类的定义格式:

    修饰符 class 类名<类型> { }

    举例:

    public class Generic{}

    这里的T可以使任意标识,常见的如T、E、K、V等形式常用于表示泛型。

    泛型类下

    public class Generic {    //定义一个变量,提供get set方法    private T t;    public T getT(){        return t;    }    public void SetT(T t){        this.t=t;    }    }

    测试类下

    public class GenericDemo {    public static void main(String[] args) {        Generic g1=new Generic<>();        g1.SetT("章三");        System.out.println(g1.getT());        System.out.println("------------------");        Generic g2=new Generic<>();        g2.SetT(100);        System.out.println(g2.getT());    }}

    运行结果

    定义这个泛型类的好处就是可以在测试中输入各种你想要的类型。

    五、泛型方法

    定义泛型方法的格式:

    修饰符 <类型> 返回值类型 方法名 (类型 类型名)

    举例:

    public  void show (T t){}

    泛型方法

     public class Generic {public  void show(T t){    System.out.println(t);}}

    泛型方法测试下:

    public class GenericDemo {    public static void main(String[] args) {       Generic g=new Generic();       g.show("张三");       g.show(100);       g.show(true);   g.show(null);    }}

    运行结果

    泛型方法比泛型类方便许多,直接在这使用即可,可以用个中类型的参数

    六、泛型接口

    格式:修饰符 interface 接口名<类型>{}

    举例:

    public interface Generic<T>{}

    既然是接口那就得定义一个类 去实现这个接口

    泛型接口:

    public interface Generic{}

    GenricImp类下:

    public class GenricImp Generic{   public void show(T t){     System.out.println(t);      }  }

    GenricDemo类下:

    public class GenricDemo{   public static void main(String[]args){        Generic g1=new GenericImp();       g1.show("张三");   Generic g2=new GenericImp();       g2.show(100);   }}

    七、类型通配符

    上限通配,?表示是T的一个未知子类。


    下限通配,?表示是T的一个未知父类。

    关于Java泛型的原理分析是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

    0