// 早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。
public class mainTest extends TestCase {
// 1.为什么需要泛型
public void testWhyUseGenerics(){
//测试一下泛型的经典案例
ArrayList arrayList = new ArrayList();
arrayList.add("helloWorld");
arrayList.add("taiziyenezha");
arrayList.add(88);//由于集合没有做任何限定,任何类型都可以给其中存放
for (int i = 0; i < arrayList.size(); i++) {
//需求:打印每个字符串的长度,就要把对象转成String类型
String str = (String) arrayList.get(i);
System.out.println(str.length());
}
// 会报出类型转换异常Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
// 为了在编译时被告知错误,而不是在运行时报异常,泛型诞生
}
public void testWhyUseGenerics2(){
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("helloWorld");
arrayList.add("taiziyenezha");
// arrayList.add(88);// 在编译阶段,编译器就会报错
}
// 2.泛型类/泛型方法/泛型接口
public interface GenericsInteface<T> {
public abstract void add(T t);
}
public void testGenerics1(){
class GenericsClassDemo<T> implements GenericsInteface<T>{
//t这个成员变量的类型为T,T的类型由外部指定
private T t;
//泛型构造方法形参t的类型也为T,T的类型由外部指定
public GenericsClassDemo(T t) {
this.t = t;
}
//泛型方法getT的返回值类型为T,T的类型由外部指定
public T getT() {
return t;
}
@Override
public void add(T t) {
}
}
}
// 3. 通配符,不知道使用什么类型来接收的时候,此时可以使用?
// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}
// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection<? super Number> coll){}
public void testGenerics3(){
Collection<Integer> list1 = new ArrayList<Integer>();
Collection<String> list2 = new ArrayList<String>();
Collection<Number> list3 = new ArrayList<Number>();
Collection<Object> list4 = new ArrayList<Object>();
getElement1(list1);
// getElement1(list2);//报错
getElement1(list3);
// getElement1(list4);//报错
// getElement2(list1);//报错
// getElement2(list2);//报错
getElement2(list3);
getElement2(list4);
}
}
【java基础】泛型
最新推荐文章于 2024-09-03 20:17:53 发布