Java 泛型的概念、泛型怎么用(泛型类泛型方法泛型接口)、泛型通配符<?>

泛型是什么

早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题,也就存在这隐患,所以Java提供了泛型来解决这个安全问题。
JDK1.5版本出现了泛型,1.7版本出现了菱形泛型。

泛型就是在定义集合的时候出现的那个<>符号,可以在<>中填入 引用数据类型 规定这个集合元素的类型(因为集合框架内所有元素都是以引用数据类型为前提的,所以如果元素是 基本数据类型 要填入他们的包装类)。

菱形泛型就是定义时右边可以不填类型,左边填了就可以。
如:ArrayList<Student> a = new ArrayList<>();

泛型省去了在使用集合的过程中类型转换的麻烦以及避免了运行时出现类型转换异常(编译时就会报错,不会等到运行时才出错)。

泛型的使用方法

public static void main(String [] args){
    ArrayList<Student> a = new ArrayList<>();
    a.add(new Student(27,"fdd"));
    a.add(new Student(27,"fdd"));
    a.add(new Student(27,"fdd"));

    ArrayList n = getSingle(a);
    System.out.println(n);
}

private static  ArrayList<Student> getSingle(ArrayList<Student> l){
    ArrayList  newList = new ArrayList();
    for (Iterator<Student> it = l.iterator();it.hasNext();){
        Student p = it.next();
        if(!newList.contains(p)){
            newList.add(p);
        }
    }
    return newList;
}

运行结果:[Student{age=27, name=‘fdd’}]

泛型类和泛型方法

就是把泛型定义在类或方法上。
泛型类和泛型方法:

private static class Tool<E>{
    private E e;
    public E getObj(){
        return e;
    }

    public void setObj(E e){
        this.e = e;
    }
    
    public void shoe(E e){
        System.out.println(e);
    }
//静态方法的泛型不能和类的泛型一致
    public static<T> void print(T t){
        System.out.println(t);
    }
}

因为静态方法是随着类的加载而加载的,而类的泛型是对象创建时传入赋值的,所以静态方法的泛型不能和类的泛型一致,静态方法的泛型是单独赋值的。

泛型类避免了运行时出现类型转换异常。
在编译时就报错:
在这里插入图片描述
常见的泛型方法:

public static <T> void print(ArrayList<T> list){
    Iterator it = list.iterator();
    while (it.hasNext()){
        T temp = (T)it.next();
        System.out.println(temp);
    }
}

泛型接口

在继承接口时填入类型,如果不填就默认为Object。

public static void main(String [] args){
    iterf it = new iterf();
    it.show("sdfsdv");
}

public static class iterf implements Inter<String>{
    @Override
    public void show(String s) {
        System.out.println(s);
    }

    public iterf(){
    }

}
interface Inter<T>{
    public void show(T t);
}

在这里插入图片描述
也可以在创建对象的时候填入泛型。

public static void main(String [] args){
    iterf<String> it = new iterf();
    it.show("sdfsdv");
}

public static class iterf<T> implements Inter<T>{
    @Override
    public void show(T t) {
        System.out.println(t);
    }

    public iterf(){
    }

}
interface Inter<T>{
    public void show(T t);
}

泛型通配符<?>

泛型通配符<?>
意思是任意类型,如果没有明确,那么就是object以及任意的Java类了。当我们不知道后面返回的是什么类型的值就用这个泛型通配符。

<extends E>

表示向下限定,可以添加E类型及其子类,E是上边界(父)。

<super E>

表示向上限定,可以添加E及其父类。

猜你喜欢

转载自blog.csdn.net/weixin_43580841/article/details/107492812