Java 泛型的使用

一、定义泛型类

定义一个泛型类Meta 和 Dual

public class Meta<T> {

    private T value;

    public Meta(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}
public class Dual<T, E> {
    private T one;
    private E two;

    public Dual(T one, E two) {
        this.one = one;
        this.two = two;
    }

    public T getOne() {
        return one;
    }

    public E getTwo() {
        return two;
    }
}

这样在使用时,更加传入的值灵活的匹配不同的类型,如下所示:
省略了强制转化,而且代码易读性更强

    public static void main(String[] args) {
        Meta<String> stringMeta = new Meta<>("字符串");
        Meta<Integer> integerMeta = new Meta<>(123);
        Meta<Boolean> booleanMeta = new Meta<>(true);
        Meta<Class<String>> classMeta = new Meta<>(String.class);

        Dual<Boolean, String> dual1 = new Dual<>(true, "简单元素");
        Dual<Double, Long> dual2 = new Dual<>(1.023, 103L);
    }

二、定义泛型方法

定义一个泛型方法, 在方法的返回值前面,添加
如果createDual的返回值<K,V>,那么返回值Dual.getOne()获取到的将会是Object类型,而不是自动匹配的类型

public class Modify {
    public static <T> String toString(T type) {
         return type.toString();
    }

    public static <K,V> Dual<K,V> createDual(K k,V v) {
        return new Dual<>(k, v);
    }
}

测试

public static void main(String[] args) {
        System.out.println(Modify.toString(1008611));
        System.out.println(Modify.toString(Arrays.asList("袁", true, null, 3333)));
        System.out.println(Modify.toString(String.class));
        Dual<Integer, String> dual = Modify.createDual(10086, "移动");
        Integer one = dual.getOne();
        String two = dual.getTwo();
        System.out.println(Modify.toString(dual));
}

执行结果

	1008611
[袁, true, null, 3333]
class java.lang.String
com.message.demo.generic.Dual@27bc2616

三、泛型接口

泛型接口与泛型类的定义类型,在接口名后面加上泛型类型即可

import java.util.List;

/**
 * 雷电将军
 * @param <T>
 */
public interface Barr<T> {

    T first(List<T> list);
}

实现接口,及其测试

import java.util.Arrays;
import java.util.List;

/**
 * 装备了天空枪的雷电将军
 */
public class SkyBarr<T> implements Barr<T>{
    @Override
    public T first(List<T> list) {
        if (list.size() ==0 ) return null;
        else return list.get(0);
    }

    public static void main(String[] args) {
        SkyBarr<String> skyBarr = new SkyBarr<>();
        String first = skyBarr.first(Arrays.asList("天", "空"));
//        first 不能传递不是在实例化时指定的类型
//        String first1 = skyBarr.first(Arrays.asList(1, 2, 3, 4));
        System.out.println(first);  //  输出 : 天
    }
}

四、泛型通配符

可以是A-Z 之间的任何一个字母,本质上这些个都是通配符。不过通常情况下会有一下约定:

  • ?表示不确定的 java 类型

  • T (type) 表示具体的一个java类型

  • K V (key value) 分别代表java键值中的Key Value

  • E (element) 代表Element

五、上界通配符

https://blog.csdn.net/youanyyou/article/details/100910242

posted @ 2021-09-03 18:26  陈析  阅读(94)  评论(0)    收藏  举报