zoukankan      html  css  js  c++  java
  • java 泛型的使用

    泛型类

     

    在类声明时通过一个标识符表示类中某个字段的类型或者某个方法的返回值或参数的类型,这样在类声明或实例化的时候只要指定自己需要的类型就ok

     

    声明带泛型的类:

    class 类名<泛型类型1,泛型类型2……>{

           泛型类型  变量名;

           泛型类型  方法名(){}

           返回值类型 方法名(泛型类型 变量名){}

    }

    使用带泛型的类:

    类名<具体类> 对象名 = new 类名<具体类>();

     

    类型参数规范:推荐使用规范-常见的泛型,泛型只保存在源文件中,class文件中不存在;也就是说在编译阶段就会丢失,基本数据类型不能作为泛型类型;

    K    键,比如映射的键  key的类型

    V     值,比如Map的值 value类型

    E     元素,比如Set<E>  Element表示元素,元素的类型

    T    泛型,Type的意思

     

    我的总结:泛型好处:限定添加类型和消除强转转换的麻烦!

     

    泛型使用

     

    public class Point<Q> {  //声明任意符号的标识符

        private Q x;  //变量类型由外部组成

        private Q y;

       

        public Q getX() {

            return x;

        }

        public void setX(Q x) {  //类型由外部决定

            this.x = x;

        }

        //..........................

    }

     

    .................main.........

    {

        Point<Double> p = new Point<Double>(); //定义具体类型

        p.setX(1.1);

        p.setY(2.2);

    }

     

    练习例子

    需求:设计一个表示点的类Point,该类有两个字段,一个是横坐标x,一个纵坐标y,要求坐标有3种表达形式(Integer,Double,String):

     

    如果不使用泛型的话可以新建多个类,但是内部方法体只有参数类型不一样,所以用泛型的话更加简单,给定一个占位符,并不明确表示到底是什么类型,在实际运用的时候才确定类型!!

     

    很好的例子!

    package generic;

    class Point<T>{

       

        private T t1;

        private T t2;

        public T getT1() {

            return t1;

        }

        public void setT1(T t1) {

            this.t1 = t1;

        }

        public T getT2() {

            return t2;

        }

        public void setT2(T t2) {

            this.t2 = t2;

        }

    }

    public class GenericDemo {

        public static void main(String[] args) {

            //String 类型的

            Point<String> p = new Point<String>();

            p.setT1("2");

            p.setT2("3");

            System.out.println(p.getT1());

            System.out.println(p.getT2());

            //Integer 类型的

            Point<Integer> p2 = new Point<Integer>();

            p2.setT1(23);

            p2.setT2(24);

            System.out.println(p2.getT1());

            System.out.println(p2.getT2());

            //Double 类型的

            Point<Double> p3 = new Point<Double>();

            p3.setT1(23.00);

            p3.setT2(24.00);

            System.out.println(p3.getT1());

            System.out.println(p3.getT2());

    //============================

            Set<String> s = new HashSet<String>();//创建一个容器对象,应该在创建的时候就明确是装什么的   

            s.add("a");

            //s.add(1);//此时就加不进去了,因为已经限制了容器内参数类型!

            //此时就能保证集合里元素类型一致,

            Set<Integer> treeSet = new  TreeSet<Integer>();

            //规定key只能是String,value是Date

            Map<String,Date> map = new HashMap<String,Date>();

            // V put(K key, V value)

            Date v = map.put("", new Date());//和上面定义的类型一样

            //V get(Object key) 

            Date val = map.get("");

        }

    }

     

    运行结果

    2

    3

    23

    24

    23.0

    24.0

    这样的话借助泛型一个类就可以表达多个不同类型的参数!

    要求

    消除强制类型的转换,如,使用Comparable比较时每次都需要类型强转;

    1、没有加上泛型,最初的需要强制类型转换

     

    package generic;

    import java.util.Set;

    import java.util.TreeSet;

    class Person implements Comparable{//需要进行排序的类要实现Comparable

       

        private Integer age;

        public Person(Integer age) {

            super();

            this.age = age;

        }

        @Override

        public int compareTo(Object o) {

            Person p = (Person)o;//强制类型转换

            return this.age.compareTo(p.age);

        }

        public String toString(){

            return this.age.toString();

        }

    }

    public class GenericDemo2 {

        public static void main(String[] args) {

            Set set = new TreeSet();

            set.add(new Person(15));

            set.add(new Person(12));

            set.add(new Person(19));

            set.add(new Person(53));

            set.add(new Person(62));

            System.out.println(set);

        }

    }

    第二步:加上泛型,不再需要强转(因为类型已经固定了)!

     

    package generic;

    import java.util.Set;

    import java.util.TreeSet;

    class Person implements Comparable<Person>{//

        private Integer age;

        public Person(Integer age) {

            super();

            this.age = age;

        }

        @Override

            public int compareTo(Person o) {

                return this.age.compareTo(o.age);//按照什么排序

            }

        public String toString(){

            return this.age.toString();

        }

    }

    public class GenericDemo2 {

        public static void main(String[] args) {

            Set<Person> set = new TreeSet<Person>();

            set.add(new Person(15));

            set.add(new Person(12));

            set.add(new Person(19));

            set.add(new Person(53));

            set.add(new Person(62));

            System.out.println(set);

        }

    }

  • 相关阅读:
    webuploader多次触发注册
    下载二进制文件
    表格打印
    多个请求下 loading 的展示与关闭
    前进刷新后退不刷新
    页面权限控制和登陆验证
    axios.post 配置formdata提交
    react错误边界
    关于beforeRouterEnter获取不到this
    JS
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11136176.html
Copyright © 2011-2022 走看看