java学习记录 0.3
该文章由 AnonymousUser在 2023年08月02日 20:32:00发布
> 无限制通配符 extends E> extends 关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或者是此类型的子类 extends E 指定父类,传入的类型都为E或者为E的子类 super 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条评论
暂无评论