泛型机制<>

1.jdk5.0之后退出的新特性:泛型
2.泛型这种机制,只在程序编译阶段起作用,只是给编译器参考的(运行阶段泛型没用)
3.使用泛型的好处:
第一:集合中存储的元素统一了。
第二:从集合中取出的元素类型是泛型指定的类型,不需要进行大量的向下转型了
4.泛型的缺点:
导致集合中的元素缺乏多样性!

package Collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class GenericTest {
    public static void main(String[] args) {
       //不使用泛型机制
        //创建集合对象
        List mylist=new ArrayList();
        //准备对象
        Cat c=new Cat();
        Bird b=new Bird();
        //将集合添加到集合里边
        mylist.add(c);
        mylist.add(b);
        //遍历集合,取出每个Animal,让他run
        Iterator it=mylist.iterator();
        while(it.hasNext()){
            //Animal a=it.next(); 没有这个语法,通过迭代器取出的就是Object
            Object ob=it.next();
            //Object中没有run方法,无法调用,需要向下转型!!
            if(ob instanceof Animal){
                Animal a=(Animal)ob;
                a.run();

            }
        }

        /*使用泛型
        使用泛型List<Animal>之后,表示List集合只允许存储Animal类型的数据
        用泛型来指定集合中存储的数据类型
         */
      /*  List<Animal> mylist=new ArrayList();
        //准备对象
        Cat c=new Cat();
        Bird b=new Bird();
        //指定list集合中只能存储Animal,如果存储String就会报错
        //这样使用泛型之后,集合中元素的数据类型就更加统一了
       // mylist.add("asd");
        mylist.add(c);
        mylist.add(b);
        //获取迭代器,这个迭代器迭代的就是Animal类型
        Iterator<Animal> it=mylist.iterator();
      while(it.hasNext()){
            //使用了泛型之后,每一次迭代返回的数据就是Animal类型
            Animal a=it.next();
            //这里也不需要进行强制类型转换了,直接调用
            a.run();
            }


          //调用子类型特有的方法还是需要向下转型的
        while(it.hasNext()){
            Animal a=it.next();
            if(a instanceof Cat){
                Cat ca=(Cat)a;
                ca.eat();
        }
            if(a instanceof Bird){
                 Bird bi=(Bird)a;
                bi.fly();
            }

        }*/


    }
}

class Animal{
    public void run(){
        System.out.println("小动物喜欢奔跑");
    }

}
class Cat extends Animal{
    public void eat(){
        System.out.println("猫喜欢吃鱼");
    }

}
class Bird extends Animal{
    public void fly(){
        System.out.println("小鸟喜欢飞");
    }

}


使用泛型之后,不需要大量的强制转换啦!!

package Collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class GenericTest {
    public static void main(String[] args) {
       //不使用泛型机制
        //创建集合对象
       /* List mylist=new ArrayList();
        //准备对象
        Cat c=new Cat();
        Bird b=new Bird();
        //将集合添加到集合里边
        mylist.add(c);
        mylist.add(b);
        //遍历集合,取出每个Animal,让他run
        Iterator it=mylist.iterator();
        while(it.hasNext()){
            //Animal a=it.next(); 没有这个语法,通过迭代器取出的就是Object
            Object ob=it.next();
            //Object中没有run方法,无法调用,需要向下转型!!
            if(ob instanceof Animal){
                Animal a=(Animal)ob;
                a.run();

            }
        }*/

        /*使用泛型
        使用泛型List<Animal>之后,表示List集合只允许存储Animal类型的数据
        用泛型来指定集合中存储的数据类型
         */
       List<Animal> mylist=new ArrayList();
        //准备对象
        Cat c=new Cat();
        Bird b=new Bird();
        //指定list集合中只能存储Animal,如果存储String就会报错
        //这样使用泛型之后,集合中元素的数据类型就更加统一了
       // mylist.add("asd");
        mylist.add(c);
        mylist.add(b);
        //获取迭代器,这个迭代器迭代的就是Animal类型
        Iterator<Animal> it=mylist.iterator();
      while(it.hasNext()){
            //使用了泛型之后,每一次迭代返回的数据就是Animal类型
            Animal a=it.next();
            //这里也不需要进行强制类型转换了,直接调用
            a.run();
            }


          //调用子类型特有的方法还是需要向下转型的
      /*  while(it.hasNext()){
            Animal a=it.next();
            if(a instanceof Cat){
                Cat ca=(Cat)a;
                ca.eat();
        }
            if(a instanceof Bird){
                 Bird bi=(Bird)a;
                bi.fly();
            }*/

        }


    }


class Animal{
    public void run(){
        System.out.println("小动物喜欢奔跑");
    }

}
class Cat extends Animal{
    public void eat(){
        System.out.println("猫喜欢吃鱼");
    }

}
class Bird extends Animal{
    public void fly(){
        System.out.println("小鸟喜欢飞");
    }

}


在这里插入图片描述

但是调用子类型的方法,还是需要强制转换!!

package Collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class GenericTest {
    public static void main(String[] args) {

        List<Animal> mylist=new ArrayList();
        //准备对象
        Cat c=new Cat();
        Bird b=new Bird();
        //指定list集合中只能存储Animal,如果存储String就会报错
        //这样使用泛型之后,集合中元素的数据类型就更加统一了
        // mylist.add("asd");
        mylist.add(c);
        mylist.add(b);
        //获取迭代器,这个迭代器迭代的就是Animal类型
        Iterator<Animal> it=mylist.iterator();
      /*  while(it.hasNext()){
            //使用了泛型之后,每一次迭代返回的数据就是Animal类型
            Animal a=it.next();
            //这里也不需要进行强制类型转换了,直接调用
            a.run();
        }*/
      //调用子类型特有的方法,还是需要进行向下转型的

        while(it.hasNext()){
            Animal a=it.next();
            if(a instanceof Cat) {
                Cat x = (Cat) a;
                x.eat();
            }
            if(a instanceof Bird){
                    Bird y=(Bird)a;
                    y.fly();
                }
            }
    }




    }



class Animal{
    public void run(){
        System.out.println("小动物喜欢奔跑");
    }

}
class Cat extends Animal{
    public void eat(){
        System.out.println("猫喜欢吃鱼");
    }

}
class Bird extends Animal{
    public void fly(){
        System.out.println("小鸟喜欢飞");
    }

}

在这里插入图片描述
自定义泛型

package Collection;
//自定义泛型 <>钻石表达式
/*java源代码中经常出现的是:
     <E>和<T>
     E是Element单词首字母
     T是Type单词首字母
     Duan随便写一般写E或T
 */

public class GenericTest01<Duan随便写> {
    public void dosome(Duan随便写 d){
        System.out.println(d);
    }
    public static void main(String[] args) {
        //new对象的时候指定了泛型是:String类型
        GenericTest01<String>  ge=new GenericTest01<>();
        ge.dosome("吃脆脆鲨");
        //类型不匹配
       // ge.dosome(123);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小心!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值