泛型笔记

一、总结

1、List<Number>不是List<Integer>的父类
        它们的类型都是List
2、List<?>是所有List<T>的父类
        但是List<?>是不能读不能写,只能做些空判断
3、List<? extends Integer>只能读
        List<? super Integer>只能写
4、泛型的局限,因为类型擦除(编译器内部永远把所有类型T视为Object处理)

  • <T>不能是基本类型,例如int,因为实际类型是Object,Object类型无法持有基本类型

  • 无法取得带泛型的Class

  • 无法判断带泛型的类型

  • 不能实例化T类型

二、示例代码

	// Pair的类型就是Pair,和泛型的类型无关
    public static void printGenericType() {
        Pair<String> sPair = new Pair<>("hello", "harry");
        Pair<Integer> iPair = new Pair<>(12, 3213);
        Class sPairClass = sPair.getClass();
        Class iPairClass = iPair.getClass();
        System.out.println(sPairClass == iPairClass);   // true
        System.out.println(sPairClass==Pair.class); // true
        System.out.println(Pair.class); // class generic.Pair

        Pair<Integer> p = new Pair<>(123, 456);
//        if (p instanceof Pair<String>) {  // 编译错误
//        }
    }
public class Pair<T> {
    private T first;
    private T last;

    // 编译器会阻止一个实际上会变成覆写的泛型方法定义。
//    @Override
//    public boolean equals(T t) {  // 编译错误
//        return this == t;
//    }

    public Pair() {
        // 不能实例化T类型
//        T t = new T(); // 编译错误
    }

    public Pair(T first, T last) {
        this.first = first;
        this.last = last;
    }

    public T getFirst() {
        return first;
    }

    public void setFirst(T first) {
        this.first = first;
    }

    public T getLast() {
        return last;
    }

    public void setLast(T last) {
        this.last = last;
    }
}
public class IntPair extends Pair<Integer>{
    public IntPair(Integer first, Integer last) {
        super(first, last);
    }
}

三、获取泛型类型

通过继承来获取泛型类型

    public static void getInheritType() {
        Class<IntPair> clazz = IntPair.class;
        Type t = clazz.getGenericSuperclass();
        if (t instanceof ParameterizedType) {
            ParameterizedType pt = (ParameterizedType) t;
            Type[] types = pt.getActualTypeArguments(); // 可能有多个泛型
            Type firstType = types[0]; // 取第一个泛型
            System.out.println(firstType);
            Class<?> typeClass = (Class<?>) firstType;
            System.out.println(typeClass);
        }
    }

完整代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值