------Java培训、Android培训、iOS培训、Net培训、期待与您交流! -------
一、泛型的概念
泛型就是允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态地指定(即传入实际的类型参数,也可称为类型实参)。Java 5 改写了集合框架中的全都接口和类,为这些接口、类增加了泛型支持,从而可以在声明集合变量、创建集合对象时传入类型实参。
类型的作用:在集合中引入泛型,能够提供编译时的类型安全,并且从集合中取得元素后不必再强制转换,简化了程序代码。
二、泛型类和泛型方法
(1)泛型类
泛型类是指包含类型参数的类,在泛型类的内部,类型参数可以用作变量的类型或方法返回参数的类型,一个泛型类可以包含多个类型参数。
定义泛型类的语法格式如下:
定义泛型接口的语法格式与定义泛型类类似,如下:
示例:
public class MyText<T> {
private T x;
private T y;
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
public T getY() {
return y;
}
public void setY(T y) {
this.y = y;
}
public static void main(String[] args) {
MyText<String> mt = new MyText<String>();
mt.setX("精度为:100");
mt.setY("纬度为:100");
System.out.println(mt.getX());
System.out.println(mt.getY());
}
}
运行结果:
精度为:100
纬度为:100
假如开发者想传入Integer类型的数据,可在MyText<String> mt = new MyText<String>();语句将String修改成Integer即可。所以使用了泛型大大提高了代码的效率,避免很多重复性工作。
(2)泛型方法
泛型方法可以为类中的属性初始化,那么如果类中的属性通过泛型指定,而又需要通过构造方法设置属性内容的时候,那么构造方法的定义与之前并无不同,不需要像声明类那样指定泛型。
定义泛型方法的语法格式:
示例:
public class MyText<T> {
private T value;
public MyText(T value ) {
this.value = value;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
public static void main(String[] args) {
MyText<String> mt = new MyText<String>("构造方法中使用泛型");
System.out.println(mt.getValue());
}
}
运行结果:
构造方法中使用泛型
三、使用多个泛型
有时在集合中需要同时放置多个对象类型。比如HashMap,必须同时放置key与value两个对象,它们成对出现,而且两个对象的类型还可能不一样。所以HashMap使用了多个类型,中间用逗号隔开。这两种泛型有先后顺序,第一种类型K为key,第二种类型V为value。
示例:
01.import java.util.Date;
02.import java.util.HashMap;
03.import java.util.Map;
04.public class MyText{
05. public static void main(String[] args) {
06. //定义多个泛型,String类型和Date类型
07. Map<String, Date> map = new HashMap<String, Date>();
08. //put()方法向HashMap类中插入值
09. map.put("time_1", new Date());
10. map.put("time_2", new Date());
11. map.put("time_3", new Date());
12. //用增强for遍历循环数组
13. for (String key : map.keySet()) {
14. Date date= map.get(key);
15. System.out.printf("key: %1$s , Value: %2$tT%n" , key, date );
16. }
17. }
18.}
运行结果:
01.key: time_1 , Value: 12:51:19
02.key: time_2 , Value: 12:51:19
03.key: time_3 , Value: 12:51:19
四、泛型通配符
在泛型很多时候会用到泛型通配符,常用的泛型通配符主要有三种:界通配符“?”、上限通配符extends和下限通配符super。
(1)界通配符“?”
泛型一个重要的特点是可以使用“?”作为通配符来匹配任何数据类型。
界通配符“?”的语法格式如下:
示例:
import java.util.ArrayList;
import java.util.List;
public class Mywenhao {
//参数使用了泛型通配符
public void print(List<?> list){
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
public static void main(String[] args) {
//创建泛型List并打印str元素
List<String> Str = new ArrayList<String>();
Str.add("One");
Str.add("dream");
Str.add(".");
Mywenhao test = new Mywenhao();
test.print(Str);
}
}
运行结果:
One
dream
.
(2)上限通配符extends
参数类型可以用我们想用的任何类型参数进行实例化,但是对于其他某些类,我们也许想将可能的类型参数集合限定为给定范围的子类型。这时可以使用extends关键字来限制参数类型,用法如下:
示例:
import java.util.Hashtable;
public class Mywenhao <K extends Number , V>{
public Hashtable<K , V> ha = new Hashtable<K , V>();
//定义put和get方法
private void put(K k,V v) {
ha.put(k , v);
}
public V get(K k) {
return ha.get(k);
}
public static void main(String[] args) {
Mywenhao<Integer, String> t = new Mywenhao<Integer, String>();
t.put(1,"One");
String str = t.get(1);
System.out.println(str);
}
}
运行结果:
One
(3)下限通配符super
通常我们用到的都是上限通配符,其实还有一个下限通配符super,用来限制泛型最小的范围。下限通配符super的用法如下:
示例:
import java.util.ArrayList;
import java.util.List;
public class MyTest {
public static void main(String[] args) {
List<? super Number> numSuper = new ArrayList<Number>();
numSuper.add(3);
numSuper.add(new Float(3.14));
System.out.println(numSuper);
}
}
运行结果:
[3, 3.14]