public class Point<T, U>{
private T pointX;
private U pintY;
public Point(T pointX, U pintY){
this.pointX= pointX;
this.pintY= pintY;}
public void showPoint(){
System.out.println(pointX);
System.out.println(pintY);}}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
类中引入类型变量,类型变量指的T, U这些,用尖括号<>括起来, 跟在类名后面。
多个类型变量可以用逗号分隔。
在类中的方法和返回值等地方可以使用类型变量。
类型变量采用大写形式,要求简短,一般E表示集合的元素类型,K和V表示key和value等。
泛型类使用:Point<Integer, Double>
泛型方法
public class FxMethod {
public static <T> T getMiddleNumber(T ... numbers){
return null;}
public <T, U> void showNumber(T t, U u){
System.out.println("t = "+ t);
System.out.println("u = "+ u);;}}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
方法中引入类型变量,在返回类型前添加<>, 中间放置类型变量,多个类型变量用逗号分隔。
在方法的参数和返回值等位置可以使用类型变量。
泛型方法使用:Integer result = FxMethod.getMiddleNumber(2, 3) 或者 Integer result = FxMethod.<Integer>getMiddleNumber(2, 3)。
public static void printList1(List<? extends Number> list){
for (Object x:list){
System.out.println(x);}}
public static void main(String[] args){
List<Integer> list = new ArrayList<>();
list.add(1);
printList1(list);// ok
List<Double> list1 = new ArrayList<>();
list1.add(1.0D);
printList1(list1);// ok
List<String> list2 = new ArrayList<>();
list2.add("1");
printList1(list2);// compile error
List<? extends Number> list3 = list;// get能用上界
Number o = list3.get(0);// 不能add
list3.add(5);// compile error
list3.add(new Object());// compile error
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
小结:
通配符上界? extends A, 表明所有的是A的类或者子类型可以传入,比如本例中的``Integer和Double都是Number的`子类,String不是。
通配符上界? extends A,确定了类型是A或者是A的子类,那么向集合容器get获取数据,肯定是它的上界类A,因为其他放的类都是A的子类,比如例子中的Number o = list3.get(0);
如果向通配符上界集合中添加元素时,会失败。 List<? extends A>, 说明容器可以容纳的是A或者A的子类,但A的子类有很多,不确定放哪个,为了安全性,就直接不让你add,比如例子中的list3.add(5);,5虽然是Number的子类,依然不能add。
通配符下界
通配符下界,可以限制传入的类型必须是这个类或者是这个类的父类。
基本语法:
<? super 下界><? super Integer>//代表 可以传入的实参的类型是Integer或者Integer的父类类型
1.
2.
例子:
public static void printList1(List<? super Integer> list){
for (Object x:list){
System.out.println(x);}}
public static void main(String[] args){
List<Integer> list = new ArrayList<>();
list.add(1);
printList1(list);// ok
List<Double> list1 = new ArrayList<>();
list1.add(1.0D);
printList1(list1);// compile error
List<String> list2 = new ArrayList<>();
list2.add("1");
printList1(list2);// compile error
List<? super Integer> list3 = list;// 不能用下界接收
Integer o = list3.get(0);// compile error
// 能add
list3.add(5);// ok
list3.add(new Number(5));// compile error
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
通配符上界? super A, 表明所有的是A的类或者A的父类可以传入。
通配符上界? super A,确定了类型是A或者是A的父类,那么向集合容器get获取数据,无法确定是A还是A的某个父类,所以不能get, Integer o = list3.get(0); // compile error,比如例子中用Integer接收,万一list3中放的是Object类型,就凉凉了。
如果向通配符下界集合中添加元素时,只能添加下届类的子类。比如例子中的:list3.add(5), list3的通配符是<? super Integer>,说明该集合存放的是Integer或者Integer的子类,我只要向容器中放Integer和它的子类都是成立的。