【java基础】泛型

// 早期的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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值