首页 > 编程语言 >JavaSE--泛型

JavaSE--泛型

时间:2023-08-15 22:36:25浏览次数:41  
标签:myList -- add Animal 泛型 new JavaSE public

一、泛型

1、泛型语法机制

  泛型这种语法机制,只在程序编译阶段起作用,只是给编译器参考的。(运行阶段泛型没用!)

2、泛型的好处

  第一:集合中存储的元素类型统一了。

  第二:从集合中取出的元素类型是泛型指定的类型,不需要进行大量的“向下转型”

3、泛型的缺点

  导致集合中存储的元素缺乏多样性。大多数业务中,集合中元素的类型还是统一的。

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

        // 使用泛型List<Animal>之后,表示List集合中只允许存储Animal类型的数据。
        // 用泛型来指定集合中存储的数据类型
        List<Animal> myList = new ArrayList<Animal>();

        // 指定List集合中只能存储Animal,那么存储String就编译报错了
        //myList.add("abc");
        Cat c = new Cat();
        Bird b = new Bird();

        myList.add(c);
        myList.add(b);

        // 获取迭代器
        // 这个表示迭代器迭代的是Animal类型。
        Iterator<Animal> it = myList.iterator();
        while(it.hasNext()){
            // 使用泛型之后,每一次迭代返回的数据都是Animal类型。
            //Animal a = it.next();
            // 这里不需要进行强制类型转换了。直接调用。
            //a.move();

            // 调用子类型特有的方法还是需要向下转换的
            Animal a = it.next();
            if(a instanceof Cat) {
                Cat x = (Cat)a;
                x.catchMouse();
            }
            if(a instanceof Bird) {
                Bird y = (Bird)a;
                y.fly();
            }
        }
    }
}

class Animal {
    public void move(){
        System.out.println("动物在移动!");
    }
}
class Cat extends Animal {
    // 特有方法
    public void catchMouse(){
        System.out.println("猫抓老鼠!");
    }
}
class Bird extends Animal {
    // 特有方法
    public void fly(){
        System.out.println("鸟儿在飞翔!");
    }
}

4、自动类型推断(又称为钻石表达式)

public class GenericTest02 {
    public static void main(String[] args) {
        // ArrayList<这里的类型会自动推断>(),前提是JDK8之后才允许
        // 自动类型推断,钻石表达式  就是后面这块<>这个长得像钻石,叫做钻石表达式
        List<Animal> myList = new ArrayList<>();

        myList.add(new Animal());
        myList.add(new Cat());
        myList.add(new Bird());

        // 遍历
        Iterator<Animal> it = myList.iterator();
        while(it.hasNext()){
            Animal a = it.next();
            a.move();
        }
        // new ArrayList<>();这个<>叫钻石表达式
        List<String> strList = new ArrayList<>();
        strList.add("http://www.126.com");
        strList.add("http://www.baidu.com");

        // 遍历
        Iterator<String> it2 = strList.iterator();
        while(it2.hasNext()){
            String s = it2.next();
            // 直接调用String类的substring方法截取字符串
            String newString = s.substring(7);
            System.out.println(newString);
        }
    }
}

5、自定义泛型

// <>尖括号中是一个标识符,随便写
// 一般写E和T
// E是element,T是Type
public class GenericTest03<T> {
    public void doSome(T o){
        System.out.println(o);
    }

    public static void main(String[] args) {

        // new对象的时候指定了泛型是:String类型
        GenericTest03<String> gt = new GenericTest03<>();
        // 类型不匹配
        //gt.doSome(100);
        gt.doSome("abc");

        
        
        GenericTest03<Integer> gt2 = new GenericTest03<>();
        gt2.doSome(100);

        MyIterator<Animal> mi2 = new MyIterator<>();
        Animal a = mi2.get();

        // 不用泛型就是Object类型
        /*GenericTest03 gt3 = new GenericTest03();
        gt3.doSome(new Object());*/
    }
}

 

标签:myList,--,add,Animal,泛型,new,JavaSE,public
From: https://www.cnblogs.com/hyy-0/p/17624079.html

相关文章

  • select......for update会锁表还是锁行
    select查询语句是不会加锁的,但是select.......forupdate除了有查询的作用外,还会加锁呢,而且它是悲观锁。 需要关闭自动提交,通过set@@autocommit=0;设置为手动提交。0代表手动提交,1代表自动提交。结果:如果查询条件用了索引/主键,那么select.....forupdate就会进行行锁。......
  • 高级有深度的英语句子
    高级有深度的句子(永远保持自我和自尊)所谓人生的归位,就是把外在东西变成你内心的力量。Lifeisadreamofalittlelessinconstant.人生是一场稍稍不那么无常的梦而已。Lifeisacontinuouscourseofdeathandrevival.生命是连续不断的死亡与复活。Ifl......
  • 简述C# 9.0增加的顶级语句--不使用 Main 方法的程序
    1.简述:    我们都知道,C#作为大型协作工业级编程语言,在编写简单应用的时候可能产生的入口代码比实际的需求代码还多的尴尬现象,这些入口代码在老袁的眼中显得非常碍眼。有没有像其它编程语言特别是脚本语言能快速编写简单可用的程序的可能呢?答案当然是有的,C#9.0增加了顶级......
  • 集合+hashmap
    数组数组(Array)是一种用连续的内存空间存储相同数据类型数据的线性数据结构。面试题:为什么数组索引从0开始?假如从1开始会怎么样?操作数组的时间复杂度当未知数组查询时,时间复杂度为O(n)总结———————————————————————————————————......
  • mybatis系列: 简介以及使用
    目录一、简介二、简单使用一、简介MyBatis本质上就是对JDBC的封装,通过MyBatis完成CRUD。MyBatis在三层架构中负责持久层的,属于持久层框架。MyBatis的发展历程:【引用百度百科】MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了go......
  • next.js 源码解析 - getStaticProps、getStaticPaths 篇
    ......
  • N1的openwrt的docker下安装homeassistant
    docker配置Docker>配置修改默认桥接的地址为路由器ip(如果n1作为旁路由的话则则这里填写主路由的ip)获取docker镜像拉取homeassistant最新docker镜像软路由打开终端执行以下命令dockerpullhomeassistant/home-assistant:latest等代码跑完后,进入软路由系统,查看镜像出现这......
  • samba--使用记录
    最近工作上参与的一个自动化项目的代码是放在一个linux上安装的git上的。在做自动化开发时,要么是远程连接到linux服务器上,然后在服务器上进行自动化开发,不过在linux操作系统上开发自动化,比较麻烦。本地电脑开发会更方便和高效一些。因此在linux装了samba.,这样可以方便本地开发自......
  • C++中const修饰符的含义
    const修饰符在C++中的用途主要是四类:1,变量类型声明的修饰:禁止对变量或对象的修改;2,函数形参中的声明修饰:禁止对传递的对象作修改,或禁止对引用变量作修改;3,函数返回类型前的修饰:禁止修改函数返回的对象;4,类成员函数声明(小括号之后、大括号之前)末尾的修饰:禁止该成员函数修改类中的任何......
  • 真正的高贵不是优于别人,而是优于过去的自己
    if you want to go famous, then we have slowly sleep; If you want to go long wisdom, then we have slowly proud. If you want to slow down the aging, then you will have to hurry up learning; If you want to slow down......