Java从入门到放弃 · 深入泛型(二)

254 阅读3分钟

“这是我参与8月更文挑战的第21天,活动详情查看: 8月更文挑战

泛型

上一篇我们讲了泛型的一些优点和弊端,还有泛型通配符的使用,带大家了解了什么是泛型,这篇我们继续来深入泛型。带领大家定义和使用含有泛型的类,方法以及接口。

定义和使用含有泛型的类

我们先来看含有泛型的类是什么样的。

public class ArrayList<E>

就像这个ArrayList集合,我们知道,在创建对象时,我们需要指明泛型的类型,而ArrayList集合能够声明所有的基本数据类型。但我们如果不使用泛型,是不是就只能在创建类时,就确定类型。下面根据例子我们来看一下:

首先定义一个含有泛型的类,类似ArrayList集合。

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

接着定义一个Test类来测试该类。

//定义一个String类型的GenericClass
GenericClass<String> g1 = new GenericClass<>("TOM");
//定义一个Integer类型的GenericClass
GenericClass<Integer> g2 = new GenericClass<>(123);
System.out.println(g1.getName());
System.out.println(g2.getName());

可以看到,我们这个类既可以使用String类型,也可以使用Integer等等其他的基本数据类型。极大的增强了复用性。

定义和使用含有泛型的方法

定义泛型的格式:
修饰符 `<泛型>` 返回值类型 方法名(参数列表(使用泛型) ){
方法体;
}

public <M> void method(M m){
    System.out.println(m);
}

含有泛型的方法,在使用时确定泛型的数据类型,传递什么类型的参数,泛型就是什么类型。

下面我们来使用一下。

public class GenericMethod {
    /*
    创建普通实例方法
     */
    public <M> void method(M m){
        System.out.println(m);
    }
    /*
    创建静态方法
     */
    public static <S> void method1(S s){
        System.out.println(s);
    }

}

同样我们写个测试类使用一下。

GenericMethod gm = new GenericMethod();
//使用实例方法
gm.method("mm");
gm.method(1);
gm.method(true);
//使用静态方法
GenericMethod.method1("这是含有泛型静态方法");

image.png 使用含有泛型的方法,有时候可以很大程度帮助我们简化代码。

定义和使用含有泛型的接口

首先创建一个含有泛型的接口

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

我们创建了接口之后,在使用接口时,要创建接口的实现类。

含有泛型的接口第一种使用方式:定义接口的实现类,并且指定接口的类型。

public class GenericInterfaceImpl implements GenericInterface<String>{
    @Override
    public void method(String s) {
    }
}

可以看到,我们重写的方法也变成了指定的类型。

接着我们来看第二种使用方法:接口使用什么泛型,实现类就使用什么类型,就相当于定义了一个含有泛型的类,创建对象时确定泛型的类型。

public class GenericInterfaceImpl02<I> implements GenericInterface<I> {
    @Override
    public void method(I i) {
    }
}

可以看到我们重写的方法参数类型也是I。然后我们来看怎么使用

GenericInterfaceImpl02<String> gii = new GenericInterfaceImpl02<>();
gii.method("和使用含有泛型的类相同");

使用是不是和创建含有泛型的类时的使用步骤相同。

写在最后

关于泛型,我们就一起学习到这里了,有兴趣的朋友可以参考上一篇的泛型一起学习,传送门

以上内容如有不正之处,欢迎掘友们批评指正!