• java泛型


    泛型
    没有引入时:
    //没有泛型 时,Object 是所有类的父类,所以向上转型
    class Generics
    {
        private Object obj;
        public void setObj(Object obj)
        {
            this.obj = obj;
        }
        public Object getObj()
        {
            return this.obj;
        }
    }
    
    public class Hi
    {
        public static void main(String[] args)
        {
            Generics gd = new Generics();
            gd.setObj(new Integer(5));
            Integer in = (Integer)gd.getObj();
            System.out.println("设置的数:"+in);
            gd.setObj(new Float(1.23F));
            Float f = (Float)gd.getObj();
            System.out.println("设置的数:"+f);
        }
    }
    /*
    设置的数:5
    设置的数:1.23
    */
    如果向下转型则容易报错
    
    泛型的创建
    [public] class 类名 <泛型类型标识1[,泛型 类型标识2,...]>
    {
        // 定义属性
        [访问控制符] 泛型类型标识     变量名;
        // 定义方法
        [访问控制符] 泛型类型标识    方法名(){};
        // 定义方法
        [访问控制符] 返回值类型    方法名(泛型类型标识   参数名){};
    }
    一般而言,类型的参数命名为单个大写字母,普通名称如下:
    E--元素
    K--键
    N--数字
    T--类型
    V--值
    S,U,V--第二,第三,第四个类型
    // 声明泛型
    class Generics<T>
    {
        private T obj;
        public void setObj(T obj)
        {
            this.obj = obj;
        }
        public T getObj()
        {
            return obj;
        }
    }
    
    // 定义泛型对象
    类名<泛型类型> 对象名 = new 类名<泛型类型>();
    其中类型为引用类型,不可为基本数据类型
    
    class Generics<T>
    {
        private T obj;
        public void setObj(T obj)
        {
            this.obj = obj;
        }
        public T getObj()
        {
            return this.obj;
        }
    }
    public class Hi
    {
        public static void main(String[] args)
        {
            // 只能是用引用的 Integer,不能用 int表示
            Generics<Integer> gd1 = new Generics<Integer>();
            gd1.setObj(new Integer(5)); // 同上转型
            Integer in = gd1.getObj();  // 向下转型
            System.out.println("设置的数为:"+in);
            Generics<Float> gd2 = new Generics<Float>();
            gd2.setObj(new Float(1.23)); // 同上转型  
            Float f = gd2.getObj(); // 向下转型
            System.out.println("设置的数组为:"+f);
        }
    }
    /*
    设置的数为:5
    设置的数组为:1.23
    */
    泛型类的构造方法与普通的无什么不同
    构造方法格式如下:
    [访问控制符] 类名([泛型类型] 参数列表)
    {
        // 构造方法语句
    }
    // 应用
    class Generics<T>
    {
        private T obj;
        public Generics(){}
        public Generics(T obj)
        {
            setObj(obj);
        }
        public void setObj(T obj)
        {
            this.obj = obj;
        }
        public T getObj()
        {
            return this.obj;
        }
    }
    public class Hi
    {
        public static void main(String[] args)
        {
            Generics<Integer> gd = new Generics<Integer>(5);
            int in = gd.getObj();
            System.out.println(in);
        }
    }
    
    //定义泛型类时声明多个类型
    class Generics<T,S>
    {
        private T obj1;
        private S obj2;
        public Generics(){}
        public Generics(T obj1, S obj2)
        {
            setObj1(obj1);
            setObj2(obj2);
        }
        public void setObj1(T obj1)
        {
            this.obj1 = obj1;
        }
        public void setObj2(S obj2)
        {
            this.obj2 = obj2;
        }
        public T getObj1()
        {
            return this.obj1;
        }
        public S getObj2()
        {
            return this.obj2;
        }
        public void show()
        {
            System.out.println("姓名:"+getObj1()+",年龄:"+getObj2());
        }
    }
    public class Hi
    {
        public static void main(String[] args)
        {
            Generics<String, Integer> gd = new Generics<String, Integer>("小二", 27);
            gd.show();
        }
    }
    //姓名:小二,年龄:27
    
    // =========
    //接收任意指定泛型时需要使用通配符
    //无界通配符 "?"
    class Generics<T,S>
    {
        private T obj1;
        private S obj2;
        public Generics(){}
        public Generics(T obj1, S obj2)
        {
            setObj1(obj1);
            setObj2(obj2);
        }
        public void setObj1(T obj1)
        {
            this.obj1 = obj1;
        }
        public void setObj2(S obj2)
        {
            this.obj2 = obj2;
        }
        public T getObj1()
        {
            return this.obj1;
        }
        public S getObj2()
        {
            return this.obj2;
        }
        public void show()
        {
            System.out.println("姓名:"+getObj1()+",年龄:"+getObj2());
        }
        public String toString()
        {
            return "姓名:"+getObj1()+",年龄:"+getObj2();
        }
    }
    public class Hi
    {
        public static void main(String[] args)
        {
            Generics<?,?> gd = new Generics<String, Integer>("小二", 27);
            gd.show();
            fun(gd);
        }
        public static void fun(Generics<?,?> t)
        {
            System.out.println("fun():"+t);
        }
    }
    /*
    姓名:小二,年龄:27
    fun():姓名:小二,年龄:27
    */
    
    受限泛型
    设置类型形参的上限
    定义类
    <泛型 类型 标识 extends 泛型类型1 & 泛型类型2 ....>
    一个类型参数可以用多个限界类型。限界类之间用 "&"分隔开,在多个限界类型中,可以用多个接口,
    但只能有一个类。如果类作为限界类型,则必须放在限界列表中的第一个。
    // 设置通配符的上限
    // 因为是 继承了 Number类,所以只能是数字
    class Generics<T extends Number>
    {
        private T obj;
        public void setObj(T obj)
        {
            this.obj = obj;
        }
        public T getObj()
        {
            return this.obj;
        }
        public void show(Generics<?> t)
        {
            System.out.println("show():"+getObj());
        }
    }
    public class Hi
    {
        public static void main(String[] args)
        {
            Generics<Integer> gd1 = new Generics<Integer>();
            gd1.setObj(3);
            gd1.show(gd1);
            info(gd1);
            Generics<Double> gd2 = new Generics<Double>();
            gd2.setObj(1.234);
            gd2.show(gd2);
            info(gd2);
        }
        public static void info(Generics<? extends Number> t)
        {
            System.out.println("info():"+t.getObj());
        }
    }
    /*
    show():3
    info():3
    show():1.234
    info():1.234
    */
    // =========
    //还可以设置下限,使其只能是某种类型或该类型的父类,只需使用 super关键字
    <? super 泛型类型>
    class Generics<T>
    {
        private T obj;
        public Generics(){}
        public Generics(T obj)
        {
            setObj(obj);
        }
        public void setObj(T obj)
        {
            this.obj = obj;
        }
        public T getObj()
        {
            return this.obj;
        }
        public String toString()
        {
            return getObj().toString();    
        }
    }
    public class Hi
    {
        public static void main(String[] args)
        {
            Generics<Integer> p = new Generics<Integer>(21);
            info(p);
        }
        //可接收 Integer, Number, Object
        public static void info(Generics<? super Integer> t)
        {
            System.out.println("info():"+t);
        }
    }
    // =============
    //泛型也可以作为父类或子类,同样也适用于继承
    //以泛型 类为父类,当父类为泛型时,该类也必定是泛型
    class Generics<T>
    {
        private T obj;
        public Generics(){}
        public Generics(T obj)
        {
            setObj(obj);
        }
        public void setObj(T obj)
        {
            this.obj = obj;
        }
        public T getObj()
        {
            return this.obj;
        }
    }
    public class Hi<T> extends Generics<T>
    {
        public Hi(){}
        public Hi(T obj)
        {
            super(obj);
        }
        public String toString()
        {
            return getObj().toString();
        }
        public static void main(String[] args)
        {
            Hi<String> p = new Hi<String>("小二");
            System.out.println("内容为:"+p);
        }
    }
    // =============
    // 子类自身的需求增加泛型类型
    class Generics<T>
    {
        private T obj;
        public Generics(){}
        public Generics(T obj)
        {
            setObj(obj);
        }
        public void setObj(T obj)
        {
            this.obj = obj;
        }
        public T getObj()
        {
            return this.obj;
        }
    }
    public class Hi<T,S> extends Generics<T>
    {
        private S sub;
        public Hi(){}
        public Hi(T obj, S sub)
        {
            super(obj);
            setSub(sub);
        }
        public void setSub(S sub)
        {
            this.sub = sub;
        }
        public S getSub()
        {
            return this.sub;
        }
        public String toString()
        {
            return ("姓名:"+getObj().toString()+",年龄:"+getSub());
        }
        public static void main(String[] args)
        {
            Hi<String, Integer> p = new Hi<String, Integer>("小二", 27);
            System.out.println("对象内容:"+p);
        }
    }
    // ==========
    //以非泛型类为父类,这时不再需要传递参数给父类
    class Generics{}
    public class Hi<T> extends Generics
    {
        private T obj;
        public Hi(){}
        public Hi(T obj)
        {
            setObj(obj);
        }
        public void setObj(T obj)
        {
            this.obj = obj;
        }
        public T getObj()
        {
            return this.obj;
        }
        public String toString()
        {
            return getObj().toString();
        }
        public static void main(String[] args)
        {
            Hi<String> p = new Hi<String>("小二");
            System.out.println("对象内容:"+p);
        }
    }
    // =============
    //泛型 接口,与泛型类差不多
    [访问控制符] interface 接口名称 <泛型类型标识>
    {
        // code
    }
    
    interface Hi<T>
    {
        public T add();
    }
    
    // =========
    interface InterGenerics<T>
    {
        public T show();
    }
    class Generics<T> implements InterGenerics<T>
    {
        private T obj;
        public Generics(){}
        public Generics(T obj)
        {
            setObj(obj);
        }
        public void setObj(T obj)
        {
            this.obj = obj;
        }
        public T getObj()
        {
            return this.obj;
        }
        public T show()
        {
            return getObj();
        }
    }
    public class Hi
    {
        public static void main(String[] args)
        {
            Generics<Integer> g = new Generics<Integer>(5);
            System.out.println("对象内容:"+g.show());
        }
    }
    //=============
    子类在实现泛型接口时明确地给出泛型类型
    interface InterGenerics<T>
    {
        public T show();
    }
    class Generics implements InterGenerics<Integer>
    {
        private Integer obj;
        public Generics(){}
        public Generics(Integer obj)
        {
            setObj(obj);
        }
        public void setObj(Integer obj)
        {
            this.obj = obj;
        }
        public Integer getObj()
        {
            return this.obj;
        }
        public Integer show()
        {
            return this.getObj();
        }
    }
    public class Hi
    {
        public static void main(String[] args)
        {
            Generics g = new Generics(5);
            System.out.println(g.show());
        }
    }
    // -----------
    //泛型方法
    格式:
    [访问控制符] [static|final] <泛型类型标识>返回值类型 方法名([<泛型类型参数>] [参数])
    // ---------
    class Generics
    {
        public <T> T show(T t)
        {
            return t;
        }
        public static <T> T staticShow(T t)
        {
            return t;
        }
    }
    // ==========
    使用泛型方法
    格式1:
    [对象名|类名.]方法名(实参列表);
    
    格式2:
    [对象名|类名.]<实际泛型类型>方法名(实参列表);
    // ------------
    class Generics
    {
        public <T> T show(T t)
        {
            return t;
        }
        public static <T> T staticShow(String str, T t)
        {
            return t;
        }
    }
    
    public class Hi
    {
        public static void main(String[] args)
        {
            Generics gen = new Generics();
            System.out.println("格式一:"+gen.show("小二"));
            System.out.println("格式1:"+Generics.staticShow("小二", 27));
            
            System.out.println("格式2:"+gen.<String>show("小二"));
            System.out.println("格式3:"+Generics.<Integer>staticShow("99", 98));
        }
    }
  • 相关阅读:
    JavaScript 语句
    JavaScript语法
    JavaScript输出
    JavaScript用法
    JavaScript简介
    利用IDEA构建springboot应用-构建好SpringBoot + SSM 框架
    SP2010开发和VS2010专家"食谱"--第二章节--工作流(4)--创建自定义任务表单
    SP2010开发和VS2010专家"食谱"--第二章节--工作流(3)--创建工作流里的任务
    SP2010开发和VS2010专家"食谱"--第二章节--工作流(2)--部署工作流的InfoPath表单
    SP2010开发和VS2010专家"食谱"--第二章节--工作流(1)--创建带有初始表单的网站工作流
  • 原文地址:https://www.cnblogs.com/lin3615/p/4317929.html
Copyright © 2020-2023  润新知