泛型:JDK1.5版本之后出现的新特性,用于解决安全问题,是一个安全机制
好处:
- 将运行时期出现的问题ClassCastException(类转换异常),转移到了编译时期,方便于程序员解决问题,让运行时问题减少,安全。
- 避免了强制转化的麻烦
泛型格式:通过 <>来定义要操作的引用数据类型
在使用java提供的对象时,什么时候写泛型呢?
通常在集合框架中很常见,只要见到<> 就要定义泛型
在类上面定义泛型:
package CollectionTest; class Worker{ } class Tool<String>{ private Object obj; public void setObject(Object obj){ this.obj=obj; } public Object getObject(){ return obj; } } public class GenericDemo2 { public static void main(String[] args){ Tool tool = new Tool(); tool.setObject("abc"); System.out.println(tool.getObject()); } }
在方法上面定义泛型:(一定是在返回类型的前面定义)
泛型类定义的泛型,在整个类中有效,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了
public static <int> void showInt(T t){ System.out.println(t); }
为了让不同方法可以操作不同的类型,而且类型还不确定。
那么可以将泛型定义在方法上
泛型的通配符:
1. 通配符使用的场景
方法的形参!
2. 通配符的优点
使方法更加通用!
3. 通配符分类
无界通配:?
子类限定:? extends Object
父类限定:? super Integer
4. 通配符缺点
使变量使用上不再方便
无界:参数和返回值为泛型的方法,不能使用!
子类:参数为泛型的方法不能使用
父类:返回值为泛型的方法不能使用
简单通配符的使用例子:
package CollectionTest; import java.util.ArrayList; import java.util.Iterator; public class GenericDemo3 { //通配符的使用 public static void printColl(ArrayList<?> al){ Iterator<?> it = al.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<String> al = new ArrayList<String>(); al.add("abc1"); al.add("add2"); al.add("abc3"); ArrayList<Integer> al2 = new ArrayList<Integer>(); al2.add(123); al2.add(1234); al2.add(12345); printColl(al); printColl(al2); } }
?通配符,也可以理解为占位符
泛型的限定:
? extends E:可以接受E类型或者E类型的子类型,上限
? super E:可以接受E类型或者是E类型的父类型,下限
复杂通配符的使用例子:
package CollectionTest; import java.util.ArrayList; import java.util.Iterator; class Person1{ private String name; private int age; Person1(String name,int age){ this.name=name; this.age=age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } class Student1 extends Person1{ Student1(String name, int age) { super(name, age); // TODO Auto-generated constructor stub } } public class GenericDemo3 { //通配符的使用 public static void printColl(ArrayList< ? extends Person1> al){ Iterator<? extends Person1> it = al.iterator(); while(it.hasNext()){ Person1 p = it.next(); System.out.println(p.getName()+".."+p.getAge()); } } public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<Person1> al = new ArrayList<Person1>(); al.add(new Person1("lisi1",10)); al.add(new Person1("lisi2",20)); al.add(new Person1("lisi3",30)); printColl(al); ArrayList<Student1> al1 = new ArrayList<Student1>(); al1.add(new Student1("zhangsan1",10)); al1.add(new Student1("zhangsan2",20)); al1.add(new Student1("zhangsan3",30)); printColl(al1); } }