范型的使用
阿里巴巴规范: 【强制】泛型通配符<? extends T>来接收返回的数据,此写法的泛型集合不能使用 add 方法, 而<? super
T>不能使用 get 方法,两者在接口调用赋值的场景中容易出错。 说明:扩展说一下 PECS(Producer Extends
Consumer Super)原则:第一、频繁往外读取内容的,适合用 <? extends T>。第二、经常往里插入的,适合用<?
super T>重点:参数类型的范型形如Pair<? extends Number>支持get方法,形如Pair<? super Integer>支持set方法 符合PESC Producer Extends Super Consermer原则具体见廖大神的博客 super extends泛型的应用
package com.example.test;
public class GenericsExtendsDemo {
public static void main(String[] args) {
Pair<Integer> p = new Pair<>(123, 456);
int n = add(p);
System.out.println(n);
Pair<Number> p1 = new Pair<>(12.3, 4.56);
Pair<Integer> p2 = new Pair<>(123, 456);
setSame(p1, 100);
setSame(p2, 200);
System.out.println(p1.getFirst() + ", " + p1.getLast());
System.out.println(p2.getFirst() + ", " + p2.getLast());
}
static int add(Pair<? extends Number> p) {
// Pair是Number的子类,但不确定p具体是什么类型,所以不能直接赋值为具体类型
Number first = p.getFirst();
Number last = p.getLast();
// 报错
// p.setFirst(new Integer(first.intValue() + 100));
// p.setLast(new Integer(last.intValue() + 100));
return p.getFirst().intValue() + p.getFirst().intValue();
}
static void setSame(Pair<? super Integer> p, Integer n) {
// Pair子类是Integer,所以get不到其类型
p.setFirst(n);
p.setLast(n);
Object t= p.getFirst();
}
}
class Pair<T> {
private T first;
private T last;
public Pair(T first, T last) {
this.first = first;
this.last = last;
}
public T getFirst() {
return first;
}
public T getLast() {
return last;
}
public void setFirst(T first) {
this.first = first;
}
public void setLast(T last) {
this.last = last;
}
}