java学习记录 0.3

该文章由 AnonymousUser在 2023年08月02日 20:32:00发布

无限制通配符 extends 关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或者是此类型的子类 extends E 指定父类,传入的类型都为E或者为E的子类 super 关键字声明了类型的下界,表示参数化的类型可能是指定的类型,或者是此类型的父类 super E ,指定输入的类型为这个类型或者为这个类型的父类

// 使用原则《Effictive Java》
// 为了获得最大限度的灵活性,要在表示 生产者或者消费者 的输入参数上使用通配符,使用的规则就是:生产者有上限、消费者有下限
1. 如果参数化类型表示一个 T 的生产者,使用 < ? extends T>;
2. 如果它表示一个 T 的消费者,就使用 < ? super T>;
3. 如果既是生产又是消费,那使用通配符就没什么意义了,因为你需要的是精确的参数类型
private  <E extends Comparable<? super E>> E max(List<? extends E> e1) {
    if (e1 == null){
        return null;
    }
    //迭代器返回的元素属于 E 的某个子类型
    Iterator<? extends E> iterator = e1.iterator();
    E result = iterator.next();
    while (iterator.hasNext()){
        E next = iterator.next();
        if (next.compareTo(result) > 0){
            result = next;
        }
    }
    return result;
}

extends Comparable<…> 表示要进行比较的都是和E可进行比较 Comparable< ? super E> 要对 E 进行比较,即 E 的消费者 泛型中这部分不理解

使用通配符时如有多个限制,则使用 &

public class Client {
    //工资低于2500元的上斑族并且站立的乘客车票打8折
    public static <T extends Staff & Passenger> void discount(T t){
        if(t.getSalary()<2500 && t.isStanding()){
            System.out.println("恭喜你!您的车票打八折!");
        }
    }
    public static void main(String[] args) {
        discount(new Me());
    }
}

泛型数组

public ArrayWithTypeToken(Class<T> type, int size) {
    array = (T[]) Array.newInstance(type, size);
}

泛型中 擦除类定义中的类型参数 - 无限制类型擦除 擦除类定义中的类型参数 - 有限制类型擦除 擦除方法定义中的类型参数

java中的桥接方法

获取泛型的参数类型

可以通过反射(java.lang.reflect.Type)获取泛型, ??反射机制

相关链接

https://pdai.tech/md/java/basic/java-basic-x-generic.html



共0条评论


    暂无评论


Leave A Comment