java之泛型总结(文字版)

其实编译之后会泛型擦除,泛型是为了防止类转换异常的出现;因此,泛型本质上不会影响程序的运行,因为如果你本身是可以运行的,那么你就可以运行,如果本身不可以运行,泛型会让你在编译时就报错,让你去改,它其实是规范了编程. 既然是规范,肯定有局限,这时候自然有个别情况下要打破局限,那就是泛型限定:
            泛型限定:上限: < ? extends Animal> ,接收Animal类型或其子类型          解决无法二层识别父子关系的问题;
            泛型限定:下限: < ? super Animal> ,接收Animal类型或父类型        解决例如像:传入比较器时传不了父类比较器的问题.

1.相当于把类型确定,从定义阶段放到了使用阶段.
2.感觉可以用在工厂里.做万能工厂,这个时候,泛型就是万能类型
    
问题1:Object类型与<T>的区别是什么?
    答:我简单片面地从   方法的角度 聊一下这个区别:
        Object是所有类的默认父类,使用多态功能时,它可以接收任何类型的子类对象;但是它有很大的弊端,在转型之前,它只能调用它本身定义的方法.这样会让子类对象传过来之后无法调用自己的特有方法,有一种壮志"壮志难酬"的感觉;
        <T>是自定义的类型,使用多态时,它可以用父类变量接收它的子类对象,在转型之前它可以使用它这个类的所有方法,只要它内部声明了足够的方法,它就可以在转型之前,对子类对象物尽其用;
         举一个简单的例子帮助理解:
                   定义第一个方法: public void 投资房地产(Object){
                               Object.getMoney();   //这一句其实是报错的,因为Object中没有定义getMoney()
                               }
                               
                   定义第二个方法: public <T> void 投资房地产(<T> t){
                               t.getMoney();
                               }
         通过比较上面两个方法:你应该明白,不是所有人都可以投资房地产的,你只能把<T> 中的T设置为大老板,才可以;
                          
                          
//泛型类定义的泛型,在整个类中有效。如果被方法使用,
//那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
//
//为了让不同方法可以操作不同类型,而且类型还不确定。
//那么可以将泛型定义在方法上。

/*
特殊之处:
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。

*/        


方法上定义声明泛型<T>或者在类上声明泛型<T>,达到的效果是一样的,它们的区别有两个:
    1.是泛型的作用域不一样:a.类上的泛型在整个类有效,b.方法上的泛型只在方法内有效
    2.泛型的确定时机不一样:a.类上的泛型确定的时机是在对象创建时,<T>会有一个跟着类名一块儿出现,在这个时候把<T>确定下来了;
                      b.方法上的泛型是在调用方法时,形参(用泛型的方法都有参数传入,不然你定义泛型搞毛线?)会接收实际参
                                数,JAVA通过反射获取实参的类名确定<T>代表的类型.        
泛型的通配符:"?" ,仅做了解.    
     举一个例子:在集合中,当用集合作为型参时,集合本身可以接收子类对象,但是集合里边的元素对子类对象无法识别,
     也就是说:如果形参是Collection<Animal> ,你可以传入ArrayList<Animal>的对象 ,也可以传入HashSet<Animal>的对象, 但是你不能传入ArrayList<Dog>或者HashSet<Dog>,因为JAVA中只做一层关系识别, 第二层及以后它识别不了.(表现的结果是,你想要它编译通过时,它会编译不通过;你想要它编译不通过时,它会编译通过,但运行时报错.)
      这个时候的解决方案就是 泛型的通配符? : 你可以把形参这样定义:Collection< ? extends Animal> 这样你传入子类集合中的元素就可以是各种动物了.这其实是对二层父子关系识别不了问题,给予的一个解决方案.
 
泛型限定简单通俗总结:
        上限------>就是说,当我集合里存储的是父类的时候,子类你也可以存进来,我把你当做你父类,结果是运行没问题,但是子类失去了特性
         下限------>就是说,当我要拿集合里边的元素进行操作时,我可以把你当做你的父类,用你父类的方法操作你,结果是运行也没问题;
     
泛型限定:上限: < ? extends Animal> ,接收Animal类型或其子类型       一般存储元素的时候用上限 ,因为将来将元素取出来都是按上限类型来操作的的,不会出现类转换异常.

泛型限定:下限: < ? super Animal> ,接收Animal类型或父类型         通常对集合中的元素进行取出操作时,可以使用下限限定;

       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值