4.泛型:
a.泛型的优点:
1.使用泛型可以避免强转麻烦
2.不使用泛型在运行时防止出现类型转换异常(ClassCastException)
b.泛型使用位置:
1.在类上使用:当创建这个类的对象时候,确定泛型的实际类型
class Test<E,....>{//...代表泛型可以有多个,用,隔开
private E e; //类上定义在泛型可以在类中使用(变量和方法)
public E method(E e){
return null;
}
}
Test<String>=new Test<String>();//E的类型被确定为String,所有用到E的地方都是String类型
2.在方法上使用:当调用method()方法时,传入什么类型T就是什么类型
class Test{//...代表泛型可以有多个,用,隔开
public <T> void method(T t){ //在方法返回值前面定义泛型,然后才能使用(形参,返回值,方法内部)
}
}
3.再接口上定义泛型:
interface Father<T>{
void method(T t);
}
class Son implements Father<String>{//在实现父接口时直接确定泛型的类型,那么方法中用到的接口上的泛型也被确定
public void method(String t){
}
}
class Son2<T> implements Father<T>{//在实现父接口时不能直接确定泛型的类型,在创建Son2()的对象确定T的类型
void method(T t){
}
}
Son2<String>son=new Son2<String>();
4.泛型通配符: ?
? extends E : ?的类型是E类型或E的子类型
? super E:?为E类型或者E的父类型
public class Demo04<T> {
public static void main(String[] args) {
Collection<String> c = new ArrayList<String>();
c.add("baby");
c.add("柳岩");
c.add("林允");
ArrayList<CharSequence> list = new ArrayList<CharSequence>(c);//ArrayList(Collection<? extends E> c)
//在new ArrayList<CharSequence>()确定了E的类型为
//E的类型为CharSequence
//ArrayList(Collection<? extends CharSequence> c)
// 把new ArrayList<String>(); 传递给ArrayList的构造函数
System.out.println(list);
Demo04<Son> demo=new Demo04<Son>();//public void method(ArrayList<? super T> al)的T被确定为Son
ArrayList<Father> al=new ArrayList<Father>();
demo.method(al);//new ArrayList<Father>() 传给 method(ArrayList<? super Son> al)
//Father代替?
//Father super Son,Father是Son的父类型OK 没问题
}
public void method(ArrayList<? super Son> al){
}
} |
|