泛型generic
1.泛型的优点:
增加可读性和稳定性
未使用泛型: List myIntList = new ArrayList();// 1
myIntList.add(new Integer(0));// 2
Integer x = (Integer)myIntList.iterator().next();// 3
使用泛型: (不需转换动作;编译器会在编译时检查类型)
List<Integer> myIntList = new ArrayList<Integer>(); // 1
myIntList.add(new Integer(0)); // 2
Integer x =myIntList.iterator().next(); // 3
2.在类中使用泛型以及定义泛型方法:
publicclass GenericDemo {
publicstaticvoid main(String[] args) {
//1.泛型的使用,泛型类定义
Person<String> p = new Person<String>("god");
System.out.println(p.getName());
//2.静态方法的泛型定义
Person.fun(new Integer(3));
}
}
class Person <T> {
private Tname;
public Person(T name){
this.name = name;
}
public T getName() {
returnthis.name;
}
publicstatic <E>void fun(E e) {
System.out.println(e.toString());
}
}
3.泛型的继承:
a.
Object[] obj =new Object[9];
Integer[] in = new Integer[9];
obj = in; //可以
Set <Object> objSet = new HashSet<Object>();
Set <Integer> inSet = new HashSet<Integer>();
objSet = inSet; //不可以的,出错
b.
Set <Object> objSet =new HashSet<Object>();
Set <Integer> inSet = new HashSet<Integer>();
//objSet = inSet; //不可以的,出错
p.fun2(objSet); //可以
p.fun2(inSet); //可以
publicvoid fun2(Set <?extends Object> set) {
System.out.println(set);
}
4. 泛型函数允许类型参数被用来表示方法的一个或多个参数之间的依赖关系,或者参数与其返回值的依赖关系。如果没有这样的依赖关系,不应该使用泛型方法。
Add:
泛型上限:<? extends Fruit>与泛型下限<? super Fruit>:
List<? extends Fruit>所应该持有的对象是Fruit的子类,而且具体是哪一个子类还是个未知数,所以加入任何Fruit的子类都会有问题,因为如果add Apple的话,可能List<? extends Fruit>持有的对象是new ArrayList<Jonathan>()Apple的加入肯定是不行的,如果 如果add Jonathan 的话,可能List<? extends Fruit>持有的对象是new ArrayList<Jonathan的子类>()Jonathan的加入又不合法,所以List<? extends Fruit> list 不能进行add
而List<? super Fruit> list 表示list持有的对象是Fruit的父类,下限是 Fruit,所以list中add Fruit或Fruit的子类是没有问题的