Java -- 泛型

来源:互联网 发布:yaml nginx 编辑:程序博客网 时间:2024/05/29 13:43

Java – 泛型
一.作用

  1. 安全:使用泛型可以在编译的时检查类型安全
  2. 省心:所以的强制类型转换都是隐式的,不需要手动强制转换,减少错误。

二.泛型类

 1.声明时使用泛型,调用时候确定具体类型
class Student<T>//声明类的时候使用泛型{    T javaScore;    T oracleScore;}public class TestGeneric {    public static void main(String[] args) {        Student<Double> student = new Student();//只能是引用类型        student.javaScore = 123.5;              //不能是基本类型        student.oracleScore = 123.5;    }}
2. 泛型类声明时,字母不能使用在静态属性和静态方法上
    public static T test //错,不能用在静态方法中
3. 接口中,泛型字母只能使用在方法中,不能使用在全局变量中   因为接口只包括全局常量和公共、抽象方法,而全局变量是static的,所以不能用,所以只能用在方法中4.关于泛型父类和子类的问题  (1)子类声明时指定了具体类型, 子类的属性和方法均为子类类型
    abstract class father<T>    {        T name;        public abstract void setName(T name)    }    class child extends father<String>    {        String t2;        @Override        public void setName(String name) {            this.name = name;        }    }
(2)子类为泛型类,父类不指定泛型   则类型变量必须和父类的保持一致(顺序可以不同)   调用的时候确定具体类型
    abstract class father<T,T1>    {        T name;        T1 age;        public abstract void setName(T name) ;        public abstract  void setAge(T1 age) ;    }    class child<T1,T> extends father<T,T1>    {        T1 t2;        T t;        @Override        public void setName(T name) {        }        @Override        public void setAge(T1 age) {        }    }
 (3)子类为泛型类,父类没有指定泛型(类型擦除),使用Object替换
    class child3<T1,T2> extends father
(4)子类和父类同时擦除
class child4 extends father{    @Override    public void setName(Object name) {    }    @Override    public void setAge(Object age) {    }}
(5)错误!: 子类擦除,父类指定泛型5.属性类型  父类中随父类而定  子类中随子类而定6.方法重写  随父类而定

总结:子类指定的泛型必须大于等于父类的泛型
二.泛型方法

  1. 只能访问对象的信息,不能修改对象的信息
    因为对象的类型还没有定,所以没法修改
public class TestGeneric {    public static void main(String[] args) {        test("aaaa");    }    public static <T> void test(T a)    {        System.out.println(a);    }}
三.泛型擦除   继承|声明实现不指定类型,使用时不指定类型,   则统一Object对待,擦除后不会有类型检查   1.会有编译器warning四.泛型没有多态   首先回顾一下多态   多态有两种形式:形参多态、返回类型多态
    public class TestGeneric {        public static void main(String[] args) {            test(new Apple());        }        public static <T> void test(Fruit f){}    }
    public static Fruit  test(Fruit f)        {            return new Apple();        }
不过,要想在泛型中实现多态的功能,必须要借助通配符五.通配符: ? extends super   1.可以用在声明类型和声明方法参数上,不能用在声明类上   2.?表示类型不定,使用时确定,用? 和 extends可以达成类似于多态的功能。表示制定的类<=,称为上限,指定类型为自身或者子类
    public static void main(String[] args) {            test(new Student<Apple>());        }        public static void test(Student<? extends Fruit> f)        {        }
3.? super 表示 >= ,称为下限,指定类型为自身或者父类4.? 只能接受和输出类型,不能修改六.泛型嵌套   1.声明:嵌套使用泛型   2.使用:从外到内,一层层拆分
public class MY<T>{    T stu;    public static void main(String[] args) {        //声明时使用嵌套        MY<Student<String>> room = new MY<Student<String>>();        //使用时候,一层层拆分        room.stu = new Student<>();        Student<String> stu = room.stu;        String score = stu.oracleScore;        System.out.println(score);    }}
七.泛型与数组   没有泛型数组,不能创建泛型数组   不过可以用?来声明,但创建失败   可以加到class里,然后强制类型转换
    public class myArray<E>{        //用Object来接收任意类型        Object[] cap = new Object[10];        //用强转.        public void Add (int index, E elem)        {            cap[index]  = elem;        }        public E[] getAll()        {            return  (E[])cap;        }        public E getEle(int index)        {            return (E)cap[index];        }
八.JDK1.7中使用泛型    声明时使用泛型,创建对象时不需要继续写泛型,写个<>就可以
    myArray<String> myArray = new myArray<>();
0 0
原创粉丝点击