温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2022-01-06 19:50:56 来源:亿速云 阅读:139 作者:柒染 栏目:开发技术

这篇文章将为大家详细讲解有关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
     

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

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

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

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

     当然也可以在输出是采用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);
            }

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

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

    四、泛型类

    泛型类的定义格式:

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

    举例:

    public class Generic<T>{}

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

    泛型类下

    public class Generic<T> {
        //定义一个变量,提供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<String> g1=new Generic<>();
            g1.SetT("章三");
            System.out.println(g1.getT());
            System.out.println("------------------");
            Generic<Integer> g2=new Generic<>();
            g2.SetT(100);
            System.out.println(g2.getT());
        }
    }

    运行结果

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

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

    五、泛型方法

    定义泛型方法的格式:

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

    举例:

    public <T> void show (T t){}

    泛型方法

     public class Generic {
    public <T> 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);
        }
    }

    运行结果

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

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

    六、泛型接口

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

    举例:

    public interface Generic&lt;T&gt;{}

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

    泛型接口:

    public interface Generic<T>{}

     GenricImp类下:

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

     GenricDemo类下:

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

    七、类型通配符

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


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

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

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI