Java中的泛型

简介: Java中的泛型

泛型类

定义泛型类:

public class GenericClass<E> {
    private E name;
    public E getName() {
        return name;
    }
    public void setName(E name) {
        this.name = name;
    }
}

使用泛型类:

//创建GenericClass对象,泛型使用Integer类型
GenericClass<Integer> gc2 = new GenericClass<>();
gc2.setName(1);
//创建GenericClass对象,泛型使用String类型
GenericClass<String> gc3 = new GenericClass<>();
gc3.setName("小明");

泛型方法

定义泛型方法:

public class GenericMethod {
    //定义一个含有泛型的方法
    public <M> void method01(M m){
        System.out.println(m);
    }
    //定义一个含有泛型的静态方法
    public static <S> void method02(S s){
        System.out.println(s);
    }
}

使用泛型方法:

GenericMethod gm = new GenericMethod();
gm.method01(10);
gm.method01("abc");
gm.method01(8.8);
gm.method01(true);
//静态方法,通过类名.方法名(参数)可以直接使用
GenericMethod.method02("静态方法");
GenericMethod.method02(1);

泛型接口

定义泛型接口:

public interface GenericInterface<I> {
    public abstract void method(I i);
}

使用泛型接口1

public class GenericInterfaceImpl1 implements GenericInterface<String> {
    @Override
    public void method(String s) {
        System.out.println(s);
    }
}

使用泛型接口2

public class GenericInterfaceImpl2<I> implements GenericInterface<I> {
    @Override
    public void method(I i) {
        System.out.println(i);
    }
}

泛型通配符 ?

因为泛型没有继承的概念,所以当一个方法的参数带有泛型时,且该泛型要通配多个类型时,需要使用泛型通配符,相当于Object类型,但因为泛型没有继承的概念,所以用?代替,表示通配任何泛型。

public static void main(String[] args) {
    ArrayList<Integer> list01 = new ArrayList<>();
    list01.add(1);
    list01.add(2);
    ArrayList<String> list02 = new ArrayList<>();
    list02.add("a");
    list02.add("b");
    printArray(list01); //参数为ArrayList<Integer> 
    printArray(list02); //参数为ArrayList<String> 
}
//这里printArray的参数需要通配任意泛型的ArrayList,所以用通配符?
public static void printArray(ArrayList<?> list){
    //使用迭代器遍历集合
    Iterator<?> it = list.iterator();
    while(it.hasNext()){
        System.out.println(it.next());
    }
}

通配符的上下限定

? extends E

泛型的上限限定: 代表使用的泛型只能是E类型的子类/本身

? super E

泛型的下限限定: 代表使用的泛型只能是E类型的父类/本身

public class Demo06Generic {
    public static void main(String[] args) {
        Collection<Integer> list1 = new ArrayList<Integer>();
        Collection<String> list2 = new ArrayList<String>();
        Collection<Number> list3 = new ArrayList<Number>();
        Collection<Object> list4 = new ArrayList<Object>();
        getElement1(list1);
        //getElement1(list2);//报错
        getElement1(list3);
        //getElement1(list4);//报错
        
        //getElement2(list1);//报错
        //getElement2(list2);//报错
        getElement2(list3);
        getElement2(list4);
        /*
            类与类之间的继承关系
            Integer extends Number extends Object
            String extends Object
         */
    }
    // 此时的泛型?,必须是Number类型或者Number类型的子类
    public static void getElement1(Collection<? extends Number> coll){}
    // 此时的泛型?,必须是Number类型或者Number类型的父类
    public static void getElement2(Collection<? super Number> coll){}
}
目录
相关文章
|
8月前
|
Java 编译器 程序员
Java 泛型
本文旨在探讨Java中泛型的使用及其类型推断,以期帮助读者更好地掌握这一重要技术。
44 0
|
8天前
|
安全 Java 机器人
|
2月前
|
存储 安全 Java
JAVA的泛型
JAVA的泛型
9 0
|
3月前
|
Java API
[Java]泛型
[Java]泛型
54 0
[Java]泛型
|
8月前
Java-泛型
泛型
30 0
|
10月前
|
IDE Java 开发工具
Java的泛型是什么?为什么要用它?
Java的泛型是什么?为什么要用它?
131 0
|
11月前
|
安全 Java 编译器
Java的泛型
泛型程序设计(Generic programming) 意味着编写的代码可以被很多不同类型的对象所重用。泛型对于集合类尤其有用,例如,ArrayList 就是一个无处不在的集合类。一个 ArrayList 类可以聚集任何类型的对象,这是一个泛型程序设计的实例。
|
Java 编译器 API
【Java】泛型
【Java】泛型
86 0
【Java】泛型
|
存储 Java API
Java中的泛型详解
我们都知道集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。