本文概览:介绍了泛型定义和使用,以及通配符的作用
1 泛型
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,即就是将类型参数化,,也就是说所操作的数据类型被指定为一个参数(之前的参数化都是针对一个值变量,此时是针对类型)。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
1.1 泛型类
1.1.1 泛型具体类
代码如下:
1 2 3 4 5 6 7 8 |
public class Pair<T, U> { T first; U second; public Pair(T first, U second) { this.first = first; this.second = second; } } |
测试类如下
1 2 3 4 5 6 |
public class PariTest { public static void main(String[] args){ Pair<String,Integer> pair = new Pair<String, Integer>("test",10); System.out.println("pair.first="+pair.first+";pair.second="+pair.second); } } |
1.1.2 泛型接口
1 、定义
1 2 3 |
interface Parent<P, R> { public R execute(P param); } |
2、使用
如下代码
1 2 3 4 5 6 |
class A implements Parent<String, Integer> { @Override public Integer execute(String param) { return null; } } |
3、问题
假设现在使用时,没有指定具体类型,如下
1 |
public class Son implements Parent{ } |
此时就默认P和R都取Object类型,和下面写法相同
1 |
public class Son implements Parent<Object,Ojbect>{ } |
1.2 泛型函数
1、定义
1 2 3 4 5 |
public class GenericMethod { public static <T> T output(T t){ return t; } } |
2、使用
这里不需要写成GenericMethod.<String>output(test),编译器会自动识别类型的,
1 2 3 4 5 6 7 |
public class GenericMethodTest { public static void main(String[] args){ String test = "测试"; String output = GenericMethod.output(test); System.out.println(output); } } |
2 通配符
2.1 引入
当我们定义了一个泛型类
1 |
Class Pair<T> { } |
假设有一个Father类和它的子类Son。那么Pari<Father>和Pari<Son>是没有继承关系。使用通配符可以实现这个,即定义一个Pair<? extends Father> 类,那么此时Pair<Son>就是其子类,此时Pair<? extends Father>和Pair<Son>存在了继承关系。 所以通配符是为了实现泛型类的具体类的继承关系。
2.2 一个Demo
1 、当返回类型是List<? extends Father>
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class Test { public static List<? extends Father> test(){ List<Son> list = new ArrayList<Son>(); Son son = new Son(); son.setName("tst"); list.add(son); return list; } public static void main(String[] args){ List<Son> son = (List<Son>)Test.test(); System.out.println(son.get(0).getName()); } } |
2、当返回类型是List<T extends Father>,如果写成如下代码,此时编译器就会报错
1 2 3 4 |
public static <T extends Father> List<T> getListT(List<T> t){ List<Son> sons = Lists.newArrayList(); return sons; } |
3、结论
通配符可以实现了模板类List的两个具体类(List<Son>和List<? extedns Fatcher>)的继承关系,“继承关系”最大作用就是实现多态。如List<? extends Father>类作为返回类型时,假设Son1、Son2、Son3都是Father的子类,那么List<Son1>类型、List<Son2>、List<Son2>都是可以作为返回类型的,实现了多态。
(全文完)