目录
  • 一、前言
  • 二、泛型
  • 三、泛型定义的格式:
    • 什么是引用类型?
    • 泛型的好处是:  
  • 四、泛型类
    • 五、泛型方法
      • 六、泛型接口
        • 七、类型通配符
          • 总结

            一、前言

            泛型在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的一个未知父类。

            总结

            本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!

            声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。