java# 泛型

使用集合的时候经常会遇到一些问题,王几何中村元素,可以存任何引用类型,但取出来全是object(自动向上转型),现在要使用类型当中特有的方法.转回来,没有把饭约束集合当中只能存某一种数据类型

什么事泛型?广泛通用的类型,代码模板中类型不确定,谁调用该段代码谁就可以来指明这个类型

package com.company;
//一半习惯写作T或者E代表Element和Key
class Point<T>{
    //可以是任何类型
    T x;
    T y;
}
public class Main {
    public static void main(String[] args) {
        //定义的时候分俩步
        //在变量的前面添加上一个
//        Point p=new Point();//创建对象的时候指明类型,没有指明就是object
        Point<String>p=new Point<>();
        p.x="10";
        p.y="20";
    }
}

注意点

泛型前后类型必须保持一致

从Java7开始,后面的类型可以不写

错误的写法:Point<Object>p=new Point<String>();就算是父类也不行

这样的写法是个语法糖,编译成字节码,泛型的本质还是Object类型.内部还是要做强转的!因此可以用反射直接拿字节码.绕过类型的检测.

应用

泛型类:在类上面定义的泛型,在创建对象的时候,要指明泛型的类型.泛型当中定义的泛型只能用在普通方法上面,不能使用在静态方法上面,静态方法是直接使用类名调用,而泛型是创建对象的时候才指定的.

泛型方法:就是在方法上面添加了泛型

package com.company;
//一半习惯写作T或者E代表Element和Key
class Test<T>{//泛型类
    //可以是任何类型
    T name;
    public T getName(){//泛型方法
        return name;
    }
    //自定义泛型
    public<T> void test(T a){

    }
    //静态方法也可以定义泛型
    static <E> void test2(){

    }
}
public class Main {
    public static void main(String[] args) {
        //定义的时候分俩步
        //在变量的前面添加上一个
        //Point p=new Point();//创建对象的时候指明类型,没有指明就是object
        Test<String>p=new Test<String>();
        new Test().test("a");//传入的是什么类型,泛型t就是什么类型.
        Test.test2(true);
    }
}

通配符

不知道使用什么类型参数来接收的时候

package com.company;
import java.util.ArrayList;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        List <Integer> list=new ArrayList<>();
        test(list);
        List <String> list2=new ArrayList<>();
        test(list2);
    }
    //?是个通配符,不知道接收什么类型的时候开业用?表示位置,通配符只能用来做接收使用,不能做添加操作
    static void test(List<?>list){
    }
}

通配符的上下线

package com.company;
import java.util.ArrayList;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        List <Integer> list=new ArrayList<>();
        test(list);
        List <Double> list2=new ArrayList<>();
        test(list2);
        List <Number> list3=new ArrayList<>();
        test2(list3);

    }
    //?是个通配符,不知道接收什么类型的时候开业用?表示位置,通配符只能用来做接收使用,不能做添加操作
    //泛型的上限:用来限定元素的类型必须得是制定类型或其的子类
    static void test(List<? extends Number>list){

    }
    //泛型的下限 用来限定元素的类型必须是指定类型或其的父类
    static void test2(List<? super Number>list){

    }
}

泛型擦除

package com.company;
import java.util.ArrayList;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        List<String>list=new ArrayList<>();
        list.add("aa");
        List list2=null;
        list2=list;//把list当中的泛型擦除掉
        list2.add(10);
        list2.add("aa");
    }
}
Last modification:April 22, 2022
如果觉得我的文章对你有用,请随意赞赏