zoukankan      html  css  js  c++  java
  • JDK5.0新特性-泛型

    泛型(重点)
    什么是泛型?
    对数据类型进行一个限定.
    应用最多的地方是集合。
    为什么要使用泛型?
    1.提高我们程序安全性.
    2.将运行阶段的问题在编译阶段解决.
    3.不用进行类型强制转换
    -----------------------------------------------
    我们学习泛型的目的:会使用集合上定义的泛型。

    1.集合上泛型的基本使用.
    //Collection<E>
    //List<E>
    //Set<E>
    //它们的作用是限定集合中元素的类型.

    我们可不可以自己在类上或接口上定义泛型?
    可以。怎样定义?

    class 类名<T>{

    }
    在类上声明的泛型怎样使用?
    类的成员:成员属性---成员方法.
    成员属性:类属性(static) 实例属性(非static)---我们管实例属性就叫成员属性.
    成员方法:类方法 实例方法(成员方法)

    类上声明的泛型 可以应用于成员方法或成员属性上。


    在类上声明的泛型不能在类的静态成员上使用?
    原因:是类上声明的泛型,只有在创建对象进才能进行类型传递。
    而静态成员是不需要对象就可以调用。


    我们可不可以在静态的方法上声明泛型?

    可以
    格式
    修饰符 <泛型> 返回值 方法名(){}


    泛型是应用于设计阶段.

    -----------------------------------------------------------------------------
    在集合上应用泛型高级
    通配符. ?

    关于?在集合中的应用.
    1. ? extends E
    代表的是E类型或E的子类类型.

    应用:在Collection接口中的addAll 方法
    2. ? super E
    代表的是E类型或E的父类类型.

    应用:在TreeSet的构造方法上。

    TreeSet集合:
    它是一个可以排序的Set集合.

    TreeSet集合怎样排序?
    1.自然顺序
    只要实现这个接口Comparable,就代表这个类型的元素具有自然顺序
    2.比较器.
    实现这个接口Comparator的类,可以根据指定条件进行比较。

    指定比较器时,如果集合中的元素是按照父类中的属性进行比较,这时可以使用父类的比较顺.

    ------------------------------------------------------------------
    泛型擦除机制

    笔试题:List<String> list=new ArrayList<String>().要求向集合中添加一个Integer数值10

    List<String> list = new ArrayList<String>();

    // list.add(10);

    List a = list;
    a.add(10);

    System.out.println(list);

    上面操作,在笔试中不要使用,而要使用反射完成.

    泛型在编译阶段有效,在运行阶段无效果。

    package cn.itcast.generic;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.junit.Test;
    
    public class Demo {
    
        @Test
        public void fun1() {
    
            //show("abc"); // 这时show方法上的T描述的就是String
    
            //show(10); // 这时show方法上的T描述的就是Intger
        }
    
        // 定义两个方法.
        // public void show(String s) {
        // System.out.println(s);
        // }
        //
        // public void show(int i) {
        // System.out.println(i);
        // }
    
        // public <T> void show(T t) {
        //
        // System.out.println(t);
        // }
    
        // public void show(Object obj) { //
        // 使用Object来描述我们的信息,类型模糊.在使用时,还需要进行手动转型.------ClassCastException
        // // 类型转换异常
        // System.out.println(obj);
        // }
    
        // 泛型应用最多的地方---集合.
        @Test
        public void fun2() {
            // Collection<E>
            // List<E>
            // Set<E>
            // 它们的作用是限定集合中元素的类型.
    
            List<String> list = new ArrayList<String>();
            list.add("abc");
    
        }
    
        // 在类上声明泛型使用
        @Test
        public void fun3() {
            GenericDemo1<String> d = new GenericDemo1<String>();
    
            // 在GenericDemo1类中的t属性它的类型是String print方法的参数与返回值也是String。
    
        }
    
        // 做一个方法,它可以将集合中的所有元素打印.
        public void show(List<?> list) {
    
            System.out.println(list);
        }
    
        @Test
        public void fun4() {
            List<String> list = new ArrayList<String>();
            list.add("a");
            list.add("b");
            list.add("c");
            
            List<Integer> list1 = new ArrayList<Integer>();
            list1.add(1);
            list1.add(2);
            list1.add(3);
            
            show(list);
            show(list1);
    
        }
    }
    package cn.itcast.generic;
    
    public class GenericDemo1<T> { // 类上声明一个泛型
    
        // 成员属性
        T t;
    
        // 成员方法-----返回值上应用 参数
        public T print(T s) {
            return s;
        }
        
        //可不可以在静态成员上使用.
        
        //static T tt;
    
        // public static T show(){
        // return null;
        // }
        
        
        //在方法上定义泛型.  定义泛型
        public  <K> K show(K k){
            return k;
        }
    }

    泛型擦除

    package cn.itcast.generic;
    
    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    import java.util.TreeSet;
    
    import org.junit.Test;
    
    public class Demo1 {
    
        // ? extends E
        @Test
        public void fun1() {
    
            List<Integer> list1 = new ArrayList<Integer>();
            list1.add(1);
            list1.add(2);
            list1.add(3);
            List<Double> list2 = new ArrayList<Double>();
            list2.add(1.0);
            list2.add(2.0);
            list2.add(3.0);
    
            // List<String> l=new ArrayList<String>();
    
            List<Number> list = new ArrayList<Number>();
    
            list.addAll(list1); // addAll(Collection<? extends E> c); E代表的是Number
            list.addAll(list2);
            // list.add(l);
    
            System.out.println(list);
    
            // 理解 Integer Double与Number的关系
        }
    
        // TreeSet集合应用
        // 要求:学生的按照年龄排序输出.---指定比较器
        @Test
        public void fun2() {
    
            TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Person>() {
                @Override
                public int compare(Person o1, Person o2) {
                    return o1.getAge() - o2.getAge();
                }
            }); // TreeSet集合中的元素必须有顺序.
            ts.add(new Student(1, "tom", 20));
            ts.add(new Student(4, "fox", 23));
            ts.add(new Student(2, "tony", 15));
    
            System.out.println(ts);
        }
    
        @Test
        public void fun3() {
    
            List<String> list = new ArrayList<String>();
    
            // list.add(10);
    
            List a = list;
            a.add(10);
    
            System.out.println(list);
        }
    
    }
    
    class Person {
        public String name;
        public int age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
    }
    
    // Student类的自然顺序就是按照id排序.
    class Student extends Person implements Comparable<Student> {
        private int id;
    
        public Student(int id, String name, int age) {
            super();
            this.id = id;
            this.name = name;
            this.age = age;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        @Override
        public int compareTo(Student o) {
    
            // return this.age-o.age;
            return this.id - o.id;
        }
    
        @Override
        public String toString() {
            return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
        }
    
    }
  • 相关阅读:
    crunch--字典生成工具
    在LINUX上查询哪个用户从哪个IP登录,登录时间,执行了什么命令?
    关于jetbrains系列产品2018.1.5以后的使用(crack)方法
    vim 加密(crypt)文本文档
    ubuntu 安装 c语言的库函数man手册
    Ubuntu Desktop 编译 ffmpeg (简略的写写)
    统计php-fpm内存占用
    ffmpeg 视频 转 gif
    一条命令将windows下多个ts文件合并为一个ts文件
    CC攻击原理及防范方法
  • 原文地址:https://www.cnblogs.com/spadd/p/4190859.html
Copyright © 2011-2022 走看看